劍指offer 反轉鍊錶

2021-08-20 19:17:24 字數 859 閱讀 6482

輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。

利用棧的輔助空間,先將鍊錶元素入棧,再將元素出棧; 利用陣列的輔助空間,先遍歷鍊錶將其放入乙個陣列,然後把陣列從後往前形成新鍊錶。

方法2:

不需要輔助空間,每一次反轉需要維護三個指標,當前節點pnode,前一節點ppre(因為當前節點反轉要指向前一節點),下一節點pnext(在改變當前節點指向之前,必須先儲存下一節點,否則鍊錶會斷開),依次反轉,直到遍歷完(pnode=null,全部節點完成反轉)。要注意幾點:

1)第乙個節點反轉之後變為尾節點,應該指向null,因此ppre初始化為null;

2)最後返回的頭指標是最後乙個節點,因此當迴圈結束,pnode=null,ppre指向的是最後乙個節點,記得要把ppre設為新的煉表頭結點;

3)特殊情況的處理:空鍊錶,只有乙個節點的鍊錶,這種情況直接返回頭指標。

方法3:用遞迴的方法實現

以1->2->3->4為例,先利用遞迴走到鍊錶末端,首先1節點傳入頭指標引數,進入else語句,一直遞迴到最後乙個4節點,p->next為空,進入if語句返回4作為newhead;然後phead變為節點3,上一級返回之後的操作是將當前結點的下下節點指向當前節點(即4指向3),然後將當前節點指向空,這樣剩下就是處理1->2->3新鍊錶,可以遞迴操作。

ac**:

非遞迴

/*

struct listnode

};*/

class solution

pnewhead=ppre;

return pnewhead;

}};

遞迴

class solution 

}};

劍指offer 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。方法1 將單鏈表儲存為陣列,然後按照陣列的索引逆序進行反轉。方法2 使用三個指標遍歷單鏈表,逐個鏈結點進行反轉。方法3 從第2個節點到第n個節點,依次逐節點插入到第1個節點 head節點 之後,最後將第乙個節點挪到新錶的表尾。public class l...

劍指offer 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。1.非遞迴 struct listnode class solution listnode ppre null listnode p phead listnode pnext null while p null else p pnext return p...

《劍指offer》 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。之前錯誤的寫法,一直不明白 原因是移位的時候,pcurr移到下一位時,裡面的值已經變成反向指標了,所以不能成功移動,就迴圈巢狀進去了,所以還需要乙個變數pnext來儲存移位前的值。struct listnode class solution phead ...