反轉連結串列的演算法實現
阿新 • • 發佈:2018-12-14
題目:定義一個函式,輸入一個連結串列的頭結點,反轉該連結串列並輸出反轉後連結串列的頭結點。 下面給出了連結串列結點的定義:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
分析: 連結串列前後元素的關聯就是通過指標實現的,每個連結串列都有一個next指標指向下一個結點,末尾的節點的next域則置NULL; 反轉連結串列就是要求修改指標的指向。下面的圖就是反轉前和反轉後的效果。 反轉前: 反轉後:
ListNode* ReverseList(ListNode* pHead) { ListNode* pReversedHead = NULL; ListNode* pNode = pHead; ListNode* pPrev = NULL; while(pNode != NULL) { ListNode* pNext = pNode->m_pNext; if(pNext == NULL) pReversedHead = pNode; pNode->m_pNext = pPrev; pPrev = pNode; pNode = pNext; } return pReversedHead; }
當然,上面的原始碼中用到了四個指標,看完原始碼就會發現和上面分析的原理並沒有相悖。或者下面這樣也是可以的,兩者的思路一致,沒有差別。只不過下面的程式碼必須注意一點,跳出while迴圈的時候,最後一個結點的next域別忘記指向前一個結點,否則就會導致“斷鏈”。
ListNode* ReverseList(ListNode* pHead) { ListNode *root=pHead; ListNode *pre=NULL; ListNode *next=NULL; if(pHead==NULL) return NULL; while(root->next){ next=root->next; root->next=pre; pre=root; root=next; } root->next=pre; return root; }