zoukankan      html  css  js  c++  java
  • 链表反转部分结点功能的实现

    #include <cstdio>
    #include <stdlib.h>
    #include <iostream>
    using namespace std;
    
    struct Node
    {
    	int data;
    	Node *next;
    };
    
    int tot = 0;
    
    Node *Node_Creat()
    {
    	Node *head;
    	head = (Node *)malloc(sizeof(Node));
    	if(head == NULL)
    	{
    		printf("Overflow
    ");
    		exit(1);
    	}
    	
    	head = NULL;
    	
    	Node *p1,*p2;
    	p1 = p2 = (Node *)malloc(sizeof(Node));
    	if(p1 == NULL || p2 == NULL)
    	{
    		printf("Overflow
    ");
    		exit(1);
    	}
    	
    	scanf("%d",&p1 -> data);
    	while(p1 -> data >= 0)
    	{
    		tot++;
    		
    		if(head == NULL)
    		{
    			head = p1;
    		}
    		else
    		{
    			p2 -> next = p1;
    		}
    		
    		p2 = p1;
    		p1 = (Node *)malloc(sizeof(Node));
    		if(p1 == NULL)
    		{
    			printf("Overflow
    ");
    			exit(1);
    		}
    		
    		scanf("%d",&p1 -> data);
    	}
    	p2 -> next = NULL;
    	
    	return head;
    }
    
    void Node_Print(Node *head)
    {
    	Node *p;
    	p = head;
    	
    	if(p == NULL)
    	{
    		printf("EMPTY
    ");
    		return ;
    	}
    	
    	while(p != NULL)
    	{
    		printf("%d ",p -> data);
    		p = p -> next;
    	}
    	printf("
    ");
    }
    
    Node *Reverse_Node(Node *head)
    {
    	Node *pPrv = NULL;
    	Node *pNext = NULL;
    	Node *pNow = head;
    	
    	Node *ReverseNode = NULL;
    	
    	while(pNow != NULL)
    	{
    		pNext = pNow -> next;
    		if(pNext == NULL)
    		{
    			ReverseNode = pNow;
    		}
    		
    		pNow -> next = pPrv;
    		pPrv = pNow;
    		pNow = pNext;
    	}
    	
    	return ReverseNode;
    }
    
    Node * ReversePart_Node(Node *head,int start,int end)
    {
    	Node *pPrv = NULL;
    	Node *pNow = head;
    	Node *pNext = NULL;
    	
    	Node *BeforeStart = NULL; //开始的结点前的结点 
    	Node *StartNode = NULL; //开始的时候的结点
    	int i,j;
    	//for循环指向需要反转的位置 
    	for(i = 1; i <= start; i++)
    	{
    		if(i == start)
    		{
    			BeforeStart = pPrv;
    			StartNode = pNow;
    		}
    		
    		pPrv = pNow;
    		pNow = pNow -> next;
    		pNext = pNow -> next;
    	}
    	
    	for(i = 1; i <= end - start; i++)  
    	{
    		pNext = pNow -> next; //保存下一个 
    		pNow -> next = pPrv; //改变指向 
    		pPrv = pNow; //移动 pPrv和 pNow 
    		pNow = pNext;
    	}
    	
    	//反转部分 未反转前的第一个结点 反转之后变成该反转部分的最后一个结点 
    	StartNode -> next = pNow; //连接 
    	
    	if(BeforeStart == NULL) //从head开始反转 
    	{
    		head = pPrv; //pNow 反转过后是 该反转部分的第一个结点 
    	}
    	else 
    	{
    		BeforeStart -> next = pPrv; //连接反转部分前面的结点 和 该反转部分 
    	}
    	
    	return head;
    }
    
    int main()
    {
    	Node *head;
    	head = Node_Creat();
    	
    	Node_Print(head);
    	
    	head = Reverse_Node(head);
    	Node_Print(head);
    	
    	int start,end;
    	scanf("%d%d",&start,&end);
    	head = ReversePart_Node(head,start,end);
    	
    	Node_Print(head);
    	
    	return 0;
    }
    
  • 相关阅读:
    [Dynamic Language] Python 命名参数
    [Dynamic Language] Python OrderedDict 保证按插入的顺序迭代输出
    div水平垂直居中
    项目小结(v1.2v1.4)
    如何能尽快看完一个网页的结构
    在项目中使用谁存储过程orTSQL语句
    UDP协议(数据报协议)
    风恋尘香欢迎你!!!
    .NEt牛人帮帮我!!!谢谢啦~~~
    LWUIT 简易漂亮的相册
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5511046.html
Copyright © 2011-2022 走看看