鏈表反轉

函數輸入參數爲頭節點指針

頭插法

首先先讓臨時指針p指向第一個元素,並將頭節點斷開,然後通過循環將每個節點重新利用頭插法進行插入

#include <iostream>
#include <cstdio>
using namespace std;

typedef struct List{
    int data;
    List *next;
}List;

void revert(List *L){
    List *p = L->next;
    L->next = NULL;
    List *next = p;
    while(p != NULL){
        next = p->next;
        p->next = L->next;
        L->next = p;
        p = next;
    }
}

int main(int argc, char **argv){
    List *L = new List;
    L->data = 0;
    L->next = NULL;
    List *p = L;
    for(int i=1;i<10;i++){
        p->next = new List;
        p = p->next;
        p->data = i;
        p->next = NULL;
    }

    p = L->next;
    while(p != NULL){
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
    revert(L);
    p = L->next;
    while(p != NULL){
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
    return 0;
}

遞歸法

從最後一個元素開始到第一個元素,將後一個元素指向前面一個即可,問題在於,最後的頭指針需要指到最後一個元素的位置,最方便的方法是從最後一個元素到第一個元素層層把這個地址返回回來

#include <iostream>
#include <cstdio>
using namespace std;

typedef struct List{
    int data;
    List *next;
}List;

List* fun(List* L){
// 其實每一層的返回都是返回的最後一個元素的地址,因爲除了最後一層返回了真實的值,其他層都是在返回上一層的返回值
    if(L->next == NULL){
        return L;
    }
    List* r = fun(L->next);
    L->next->next = L;
    L->next = NULL;
    return r;
}
int main(int argc, char **argv){
    List *L = new List;
    L->data = 0;
    L->next = NULL;
    List *p = L;
    for(int i=1;i<10;i++){
        p->next = new List;
        p = p->next;
        p->data = i;
        p->next = NULL;
    }

    p = L->next;
    while(p != NULL){
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
    L->next = fun(L->next);
    p = L->next;
    while(p != NULL){
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
    return 0;
}

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