單鏈表的逆置

概念:

將單鏈表倒序,即指針倒置,什麼意思呢?就是這個意思:
這裏寫圖片描述

其實就是原來的前驅節點變爲後繼節點,原來的後繼節點變爲前驅節點,頭節點指向原來的尾節點

值得注意的是:這裏的頭結點的處理

實現思想:

利用頭插法,將第一個節點後面的節點依次插在第一個節點之前。

方法:

  • 首先要聲明兩個指針變量,一個爲位移指針(記錄當前節點),一個爲置換指針(即通常所說的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);   //再次輸出逆置之後的結果

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章