劍指Offer 一 鍊錶反轉

2021-10-09 05:44:21 字數 1201 閱讀 1681

例如: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 ...