例如:1->2->3->4->5->null
反轉之後:5->4->3->2->1->null
鍊錶通常會有乙個頭結點和乙個尾節點,頭結點沒有儲存值,只是起到指向下乙個的作用,尾節點有數值,但是指向的下乙個尾null,但是應該如何構建乙個標準的鍊錶呢?
定義乙個結構體:
struct listnode
;
建立鍊錶:
listnode *l; //l提供的是鍊錶的頭結點,沒有對它進行賦值,而是將直接指向了新節點p。
listnode *temp,*p; //temp相當於中間變數,p為每次建立的節點
l=new listnode; //新建頭部節點
temp=l;
for(int i=0;i<5;i++)
temp->next=null;
//最後乙個節點p加進去之後,temp轉移到鍊錶的尾部,這個時候的鍊錶並沒有結束符,
//所以我們需要在最後加上temp->next=null,來保證鍊錶的完整性。
反轉鍊錶便是將原來指向的後乙個節點的方向改為指向前乙個節點,那麼對於原來的頭結點,肯定是要拋棄的,而對於尾節點,則需要重新新建乙個節點,我們大可不必這麼麻煩,因為由於鍊錶的特殊性,我們完全可以將原來的頭結點重新指向鍊錶的尾節點,讓原本頭結點的下乙個節點指向null,畢竟總共的節點數沒有變化。
class solution
pcurent->next=pprev;//指標反轉
pprev=pcurent;//pprev需要向後移動一位
pcurent=pnext;//pcurent也需要向後移動一位
}}};
鍊錶不帶有頭結點:
class solution
pcurent->next=pprev;
pprev=pcurent;
pcurent=pnext;
}}};
遞迴實現:
public class linkedlistpractice
}listnode head;
public listnode reverselist(listnode head)
}
參考文章: 劍指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 ...