1.題目
- 輸入一個鏈表的頭結點,首先反轉鏈表后,然后輸出鏈表的所有元素(牛客網)。
struct ListNode { int val; struct ListNode *next; };
2.思路
# 反轉鏈表
輔助指針:定義三個用於翻轉鏈表的輔助指針和一個用於表示翻轉鏈表頭結點的指針,node指向當前節點、left指向當前節點的前一個節點、right指向當前節點的下一個節點、ReverseHead指向翻轉鏈表的頭結點。
翻轉鏈表過程:循環翻轉鏈表,每次循環翻轉一個結點。判斷node是否是最后一個結點,如果是最后一個節點,則reverseHead指向node(確定翻轉鏈表表頭節點),然后node指向left(翻轉鏈表),退出循環;如果不是最后一個節點,則node指向left(翻轉鏈表),移動left和node指針。
# 魯棒性
- 空鏈表
- 有一個節點的鏈表
- 有多個節點的鏈表
3.code
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* ReverseList(ListNode* pHead) 12 { 13 // 反轉指針 14 ListNode* pNode=pHead; // 當前節點 15 ListNode* pPrev=nullptr;// 當前節點的上一個節點 16 ListNode* pNext=nullptr;// 當前節點的下一個節點 17 ListNode* pReverseHead=nullptr;//新鏈表的頭指針 18 19 // 反轉鏈表 20 while(pNode!=nullptr) 21 { 22 pNext=pNode->next; // 建立鏈接 23 24 if(pNext==NULL) // 判斷pNode是否是最后一個節點 25 pReverseHead=pNode; 26 27 pNode->next=pPrev; // 指針反轉 28 pPrev=pNode; 29 pNode=pNext; 30 } 31 return pReverseHead; 32 } 33 };