鏈表的逆置之頭插法:
頭插法的核心思想就是先把當前的鏈表切分為兩個部分,第一個部分為只有一個頭節點的單鏈表,第二個部分是除頭節點外的剩余所有的鏈表,挨個把第二部分的節點插入到第一個部分中,插入的方法是運用建立單鏈表的頭插法,其剛好可以起到逆置的作用。
此方法的空間復雜度為O(1)
代碼如下:
void reverse(LinkList *L) { LinkList *p=L->next,*q;//p指向的是L的首節點 L->next=NULL;//重新設定L是一個帶頭節點的空表 while(p!=NULL) { q=p->next;//設定q為p的后繼節點 q->next=L->next;//頭插法將q插入到L的后面 L->next=q;//頭插法 p=q;//q后移,繼續頭插法直到p為空 } }
完整的測試代碼:
#include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *next; }Node; void creat_linkList(Node *L){ //尾插法 Node *rear=L; for(int i=0;i<10;i++) { Node *node=(Node *)malloc(sizeof(Node)); node->data=i; node->next=NULL; rear->next=node; rear=node; } } void reverse(Node *L) { Node *p=L->next; L->next=NULL; Node *q=NULL; while(p!=NULL) { q=p->next;//定義一個在p后面的節點為q p->next=L->next;//L的next指的是p原先的位置,現在需要p回頭指向自己原先指定的位置 L->next=p;//再讓L的next記錄當前p的位置,方便p往后移后,新的p可以回頭指自己先前的位置達到逆轉的作用 p=q;//p再轉到下一個位置 } } int main(){ Node L; L.data=1000; L.next=NULL; creat_linkList(&L); reverse(&L); Node *p=L.next; while(p!=NULL) { printf("%d\n",p->data); p=p->next; } }