介绍单链表的反转,链表反转有两种实现方式,一种是单纯利用指针改变结点指向来实现,一种是利用头插会反向的性质实现。
首先说明下链表和结点的结构;
typedef struct node{ int data; struct node *next; }*listNode,*list;
一般至少两个结点才有必要反转。
进行反转,我们需要两个指针,一个pCur指向当前反转的结点,一个prev指向前一个结点。
首先让pre的next指向pCur的下一个结点;再让pCur的next指向头节点的下一个结点;这时已经反转了结点,此时链表第一个结点变成了反转的结点,让头节点的next指向pCur;最后移动pCur到下一个要反转的结点。重复上述步骤,直到pCur为NULL。
void reverse_list(list L){ if(L->next==NULL){ /*empty list*/ printf("the list is empty.\n"); return; }else if(L->next->next==NULL){ /*only one node*/ return; } listNode* prev=L->next; listNode* pCur=prev->next; while(pCur!=NULL){ prev->next = pCur->next; pCur->next = L->next; L->next = pCur; pCur = prev->next; } return; }
头插法会让新插入的结点在链的最前端,可以参考之前的线性数据结构,里面有头插法的实现。
pCur指向当前需要反转的结点,pNex指向下一个结点。遍历链表,依次把pCur插入链表L中。即实现反转。
void reverse_list(list L){ if(L->next==NULL){ /*empty list*/ printf("the list is empty.\n"); return; }else if(L->next->next==NULL){ /*only one node*/ return; } listNode* pCur=L->next->next; listNode* pNex=pCur->next; while(pCur!=NULL){ pNex=Pcur->next; pCur->next=L->next; L->next=pCur; pCur=pNex; } return; }
网上最常见的反转用了三个指针,实际你会发现,只需要两个指针就够了。链表反转是很简单的问题,但是可以有多种方法,通过小小的程序熟悉链表的操作,也是很有意思的。
原文:https://www.cnblogs.com/cpcpp/p/13374900.html