单链表的逆置

来源:互联网 发布:java接口的定义 编辑:程序博客网 时间:2024/05/21 08:38

单链表的逆置

思路一:

我们需要3个指针,指向3个连续的节点,前两个实现逆置,第三个用来记录链表,防止逆置以后链表断了。

在每一轮循环中,先用p3记录p2的next位置,将p2的next指向p1,最后让p1指向p2,p2指向p3.整个循环结束以后,p2停留在原来链表尾部的NULL处,p1停留在原来链表的最后一个元素。

最后,将原来head的next指向NULL,而将head指向p1,将head返回就行了。

实现代码如下:

//单链表的逆置#include <stdio.h>#include <stdlib.h>typedef struct node {int data;struct node *next;}Node;//创建链表Node *CreatList(void){int val, i, n;Node *phead, *p, *q;p = NULL;q = NULL;phead = NULL;printf("请输入您要建立的链表长度:\n");scanf("%d", &n);printf("请输入您要输入的数据:\n");for (i = 0; i<n; ++i){scanf("%d", &val);p = (Node *)malloc(sizeof(Node));p->data = val;if (NULL == phead)q = phead = p;//q是一个临时变量elseq->next = p;q = p;}p->next = NULL;return phead;}//链表的逆置Node *ReverseList(Node *phead){Node *p, *q, *r;p = phead;q = r = NULL;while (p){q = p->next;p->next = r;r = p;p = q;}return r;//返回翻转后链表的头指针}//输出链表void ShowList(Node *phead){Node *p;p = phead;while (p){printf("%d ", p->data);p = p->next;}printf("\n");}int main(void){Node *phead;phead = CreatList();printf("链表逆置前的数据:\n");ShowList(phead);phead = ReverseList(phead);printf("链表逆置后的数据:\n");ShowList(phead);return 0;}

思路二:

单链表的逆置就是把链表的指针逆转,我们还是需要三个指针: pNode指向当前位置,Prev指向上一个位置,pNext指向下一个位置。
当翻转链表第一个结点时,先把pNode指向下一个结点赋给pNext,然后改变pNode的指向,给它赋值为Prev,因为这时Prev为NULL,这就把翻转的链表尾搞好了。
中间结点的翻转,就不解释了,很easy。
翻转最后一个结点时,由于pNext为NULL,所以这时我们要记住pNode,这个pNode就是新链表的头结点了,所以它赋值给pHead,最后跳出循环。
我这里的链表是头结点指向而不是头指针指向的,并且Prev初始赋值为NULL,也是很重要的。

实现代码如下:

//单链表的逆置 C++typedef int DataType;typedef struct node //单链表的定义{DataType data;struct node* next;}LinkedNode,*LinkList;void ReverseList(LinkList &Listhead){cout<<"Begin to Reverse the List"<<endl;      if( (NULL==ListHead)||(NULL==ListHead->next) ) //边界检测 return ; LinkedNode *pPre=ListHead;//先前指针LinkedNode *pCur=pPre->next;//当前指针LinkedNode *pNext=NULL;//后继指针while(NULL!=pCUr){pNext=pCUr->next;pCur->next=pPre;pPre=pCUr;  //将当前指针赋给先前指针,即将二者的位置翻转(链表已逆置)pCUr=pNext;//将临时结点pNext的值赋给pCur,继续进行逆置}//将原来的头结点ListHead的next指向NULL,因为它已经变成了末尾元素了ListHead->next=NULL;ListHead=pPre;//记录下新的头结点}


参考文章:

http://blog.csdn.net/odaynot/article/details/7992771

http://www.cnblogs.com/venow/archive/2012/08/26/2657559.html

1 0