概念:
將單鏈表倒序,即指針倒置,什麼意思呢?就是這個意思:
其實就是原來的前驅節點變爲後繼節點,原來的後繼節點變爲前驅節點,頭節點指向原來的尾節點
值得注意的是:這裏的頭結點的處理
實現思想:
利用頭插法,將第一個節點後面的節點依次插在第一個節點之前。
方法:
- 首先要聲明兩個指針變量,一個爲位移指針(記錄當前節點),一個爲置換指針(即通常所說的temp);
- 將頭指針賦給位移指針,頭指針置爲空
- 開始循環(在位移指針不爲空的情況下)
- 1:將當前的節點指針域值給置換指針
- 2:將頭節點指針域的指針域值給當前節點指針域
- 3:將當前節點的地址給頭節點指針域
- 4:將置換指針值給當前節點(即位移指針向後移動)
這樣就完成了一個循環,就又可以循環了!
實現一個循環之後,結果是這個樣子的:
每次循環之後的結果依次類推
算法代碼
void Reverse(Linklist L)
{
Node *temp,*pre;
pre = L->next;
L->next = NULL;
while(pre){
temp = pre->next; // 1
pre->next = L->next; // 2
L->next = pre; // 3
pre = temp; // 4
}
}
完整程序代碼
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node *next;
}Node,*Linklist;
Linklist CreatFromTail()
{
printf("請輸入數字,輸入'0'時結束:\n");
Linklist L;
Node *s;
int x;
L=(Linklist)malloc(sizeof(Node));
L->next=NULL;
while(1)
{
scanf("%d",&x);
if(x!=0)
{
s=(Node *)malloc(sizeof(Node));
s->data=x;
s->next=L->next;
L->next=s;
}
else
{
break;
}
}
return L;
}
void Output(Linklist L)
{
Node *p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void Reverse(Linklist L)
{
Node *temp,*pre;
pre = L->next;
L->next = NULL;
while(pre){
temp = pre->next;
pre->next = L->next;
L->next = pre;
pre = temp;
}
}
int main()
{
Linklist L;
L=CreatFromTail();//創建單鏈表
Output(L);//打印輸出單鏈表
Reverse(L);//逆置單鏈表
Output(L); //輸出逆置之後的鏈表
Reverse(L); //再次逆置
Output(L); //再次輸出逆置之後的結果
}