單鏈表反轉分析

2021-09-09 03:07:19 字數 2835 閱讀 1668

第一次交換

第二次交換

第三次交換

步驟:定義當前結點 current,初始值為首元結點,current = l->next;

定義當前結點的後繼結點 pnext, pnext = current->next; 

只要 pnext 存在,就執行以下迴圈:

最後將頭結點與 current 重新連上即可,l->next = current;

函式設計如下:

/* 單鏈表反轉/逆序 */

status listreverse(linklist l)

//printf("current = %d,next = %d \n",current->data,current->next->data);

l->next = current; /* 將煉表頭節點指向p1 */

return l;

}

status listreverse2(linklist l)

current = l->next;

while (current->next != null)

return l;

}

p = current->next; p 就相當於前面的 pnext。(圖1中a2即為p)

current->next = p->next; p->next 就相當於 prev的角色,這句**意思是 current 的後繼指向 prev.(相當於圖1中a1->next = a3(a2->next))

p->next = l->next; 這句就是 p 的後繼直接指向首元節點。(相當於圖1中a2->next = a1)

l->next = p; 然後再將頭結點指向 p。(相當於圖1中l->next = a2

這個是程式執行的結果。

整體建立l的元素(頭插法):

// 原鍊錶,current = 68, pnext = 55,68指向18,55指向18,頭結點指向55

-> 68 -> 55 -> 18 -> 45 -> 41 -> 43 -> 5 -> 28 -> 80 -> 67

// 第一次交換後,原鍊錶變成這樣

-> 55 -> 68 -> 18 -> 45 -> 41 -> 43 -> 5 -> 28 -> 80 -> 67

// 進行第二次交換,pnext = 18,68指向45,18變成頭結點

-> 18 -> 55 -> 68 -> 45 -> 41 -> 43 -> 5 -> 28 -> 80 -> 67

// 進行第三次交換,pnext = current->next = 45,68指向41,45變成頭結點

-> 45 -> 18 -> 55 -> 68 -> 41 -> 43 -> 5 -> 28 -> 80 -> 67

// ……

-> 41 -> 45 -> 18 -> 55 -> 68 -> 43 -> 5 -> 28 -> 80 -> 67

-> 43 -> 41 -> 45 -> 18 -> 55 -> 68 -> 5 -> 28 -> 80 -> 67

-> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68 -> 28 -> 80 -> 67

-> 28 -> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68 -> 80 -> 67

-> 80 -> 28 -> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68 -> 67

// current 68 沒有後繼,反轉結束

-> 67 -> 80 -> 28 -> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68

反轉l後

-> 67 -> 80 -> 28 -> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68

最後附上完整**,反轉有兩個函式。

有兩個方法可以實現單鏈表的反**

方法一:

#include #include typedef struct node

node;

node *head,*p;

node * reverselink(node *head)

head->next=null;

head=p1;

return head;

}void createlist(int n)

q->next=null;

} void printlist()

printf("\n");

}void main()

方法二:

#include #include using namespace std; 

struct lnode;

lnode * initlist()

newptr->next=null;

return head;

} void print(lnode *head)

cout << endl;

} void reverse(lnode *head)

} int main()

參考:

單鏈表反轉

單鏈表反轉,可以用迴圈做,當然也可以遞迴 詳見 include includestruct node 3 1 4 6 2 1 1 3 4 6 2 2 4 1 3 6 2 3 6 4 1 3 2 4 2 6 4 1 3 5 迴圈反轉,即依次改動3個指標值,直到鍊錶反轉完成 比如,上面第 1 行到第 2...

反轉單鏈表

include stdafx.h include include using namespace std struct listnode typedef listnode plistnode typedef plistnode list list creatlist return head void...

單鏈表反轉

想起很早以前某次面試,面試官很嚴肅的要求我現場手寫單鏈表反轉的 哥虎軀一震,心想 不就需要要個臨時變數來記錄位址嗎,用得著這樣煞有介事?雖然在那之前我的確沒寫過這個程式,哈哈哈 當時我草草寫了十來行 面試官不等我完成,就直接拿過去開始問問題。不知道是不是因為抗壓能力不足,在面試官的不斷 盤問 下,哥...