• 数据结构—头插法逆转单链表——空间复杂度为O(1)


    #if 1
    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    
    using namespace std;
    
    struct Node
    {
    	int data;
    	Node *next;
    };
    
    //初始化
    Node *init()
    {
    	Node *head=new Node;
    	head->next=NULL;
    	return head;
    }
    
    //头插法创建节点
    void insetList(Node *head,int i)
    {
    	Node *cur=new Node;
    
    	cur->data=i;
    
    	cur->next=head->next;
    	head->next=cur;
    }
    
    //链表A生成
    void CreateList(Node *head_A)
    {
    	for(int i=-8;i<10;i++)
    	{
    
    		insetList(head_A,++i);
    	}
    }
    
    //打印链表
    void print(Node *head)
    {
    	Node *temp=head->next;	//防止头指针移动
    	while(temp)
    	{
    		cout<<temp->data<<"  ";
    		temp=temp->next;
    
    	}
    }
    
    //拆分链表A,链表C源于A。生成链表B
    void ReversalList(Node *head_A,Node *List_C)
    {
    	Node *pa=head_A->next;	//pa指向链表A的首元节点,作为逆转尾节点,可以省略pa
    	
    
    
    	Node *pb=pa->next;		//pb指针指向pa后继节点,为移动指针
    	
    	pa->next=NULL;			//此处---首元节点置空
    			
    	Node *pc=pb;			//pc存放pb后继节点,为移动指针
    
    	
    	while(pb)		//!!!退出条件为最后一个节点头插入第一个节点,在插入之前将NULL给了pc,然后改变pb的指针域
    	{
    			pc=pb->next;  //pc指向pb后继
    
    			pb->next=head_A->next;	//pb作为新节点用头插法插入首元节点之前
    
    			head_A->next=pb;		//头节点指向新插入的pb节点
    
    			pb=pc;					//pb指向原来pb节点的后继开始循环
    
    	}
    
    }
    void main()
    {
    	Node *head_A=init();	//链表A初始化头节点
    
    	//链表C初始化,结构体指针记得初始化头节点
    	Node *List_C=head_A;	//
    
    	//创建链表A
       CreateList(head_A);
    
       //打印链表A
       cout<<"链表A为:"<<endl;
       print(head_A);
       cout<<endl;
    
       //调用函数逆转链表A
       ReversalList(head_A,List_C);
    
        //打印链表C
       cout<<endl<<"逆转链表List_C为:"<<endl;
       print(List_C);
       cout<<endl;
    
       system("pause");
    
    }
    #endif
    
    /*
    总结:
    循环退出条件为最后一个节点头插入第一个节点,在插入之前将尾节点NULL给了pc,pc再给pb,然后改变pb的指针域;
    头指针head是作为头插法不能改变的指针,可以设一个临时结构体指针指向源链表首元节点(pa),也可以省略;
    头插法的新节点为pb,pb将下一个节点的地址交给pc后,pb相当于一个独立节点,由于循环机制,在插入后需要重置pb指针位置;
    该算法共新建三个指针,其中两个为移动指针;
    */
    

      

  • 相关阅读:
    【C++ 学习笔记】 Vector
    【AWS】 AWS Free Usage Tier
    【C++ 学习笔记】 MFC CEdit
    【MySql】MySql安装和ODBC设置
    【C++ 学习笔记】 变量转换
    【Perl学习笔记】列表和数组
    【C++ 学习笔记】 值传递
    【Java 学习笔记】 MyEclipse各种细节
    【NLP】 向量空间模型
    【Linux】 Cygwin操作总结
  • 原文地址:https://www.cnblogs.com/huxiaobai/p/10541400.html
Copyright © 2020-2023  润新知