數據結構 鏈表的頭插法逆置


鏈表的逆置之頭插法:

頭插法的核心思想就是先把當前的鏈表切分為兩個部分,第一個部分為只有一個頭節點的單鏈表,第二個部分是除頭節點外的剩余所有的鏈表,挨個把第二部分的節點插入到第一個部分中,插入的方法是運用建立單鏈表的頭插法,其剛好可以起到逆置的作用。

此方法的空間復雜度為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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM