劍指offer 鍊錶

2021-10-24 08:44:59 字數 2853 閱讀 1384

劍指offer(三):從尾到頭列印鍊錶

輸入乙個鍊錶,按鍊錶從尾到頭的順序返回乙個arraylist。

/*思路:遍歷一遍鍊錶,把鍊錶的值儲存到陣列中,逆序陣列。*/

class

solution

return vector<

int>

(res.

rbegin()

, res.

rend()

);}}

;

劍指offer(十四):鍊錶中倒數第k個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。

/*思路:遍歷一遍鍊錶,求出鍊錶的長度,求倒數第k個結點,即正數第n-k+1個結點,從頭結點走n-k步,找到該節點*/

class

solution

};

劍指offer(十五):反轉鍊錶

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

方法一:迭代版本:

/*思路:用乙個額外變數記錄當前節點的前驅結點,遍歷一遍鍊錶,鍊錶不空時,當前節點的下乙個點指向前驅,前驅結點後移,當前點往後移(需要記錄當前點的下乙個點),最後前驅結點即為反轉鍊錶的頭結點。*/

class

solution

return pre;}}

;

方法二:遞迴版本:

/*思路:1->2->3->4->5->null 遞迴後,5->4->3->2->null,再把2指向1,1指向空,遞迴後的尾指標即為新鍊錶的表頭*/

class

solution

};

劍指offer(十六):合併兩個排序的鍊錶

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。

/*思路:二路歸併演算法,每次找到剩餘所有數的最小值,放到新鍊錶的後邊*/

class

solution

if(phead1) tail-

>next = phead1;

if(phead2) tail-

>next = phead2;

return dummy-

>next;}}

;

劍指offer(二十五):複雜鍊錶的複製

請實現乙個函式可以複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個指標指向下乙個結點外,還有乙個額外的指標指向鍊錶中的任意結點或者null。

/*思路:1.在每個結點的後邊插入乙個結點;2.遍歷一遍鍊錶,把複製結點的random指標賦值;3.把複製的結點接到新的煉表裡。*/

class

solution

// 遍歷一遍鍊錶,把random指標賦值

for(

auto p = phead; p; p = p-

>next-

>next)

// 把複製結點接到新的鍊錶

auto dummy =

newrandomlistnode(-

1);auto cur = dummy;

for(

auto p = phead; p; p = p-

>next)

return dummy-

>next;}}

;

劍指offer(三十六):兩個鍊錶的第乙個公共結點

輸入兩個鍊錶,找出它們的第乙個公共結點。(注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的)

/*思路:兩個指標p和q分別指向兩個鍊錶的表頭,p和q同時每步往後移,若p先走到空節點,再接著從第二個煉表頭開始走;若q先走到空節點,再接著從第乙個煉表頭開始走,當p和q相遇時,一定走到第乙個公共結點(相交)或者空結點(不相交)*/

class

solution

return p;}}

;

劍指offer(五十五):鍊錶中環的入口結點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

/*思路:定義快慢指標,快指標每次走兩步,慢指標每次走一步,無環,返回空,有環,在第一次相遇時,慢指標退回表頭,此時,慢指標和快指標同時一起走,當兩個指標相遇時,即為環的入口結點*/

// 注:c++中,return null、nullptr、0是一樣的

class

solution

return i;

// 第二次相遇一定是環的入口結點}}

return0;

// 鍊錶為空,無環}}

;

劍指offer(五十六):刪除鍊錶中重複的結點

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5

/*思路:遍歷煉表裡的值,存放在陣列裡,建立乙個新的鍊錶,鍊錶值為陣列裡次數為1的值*/

class

solution

}return dummy-

>next;}}

;

完整程式:

#include

using

namespace std;

struct listnode};

listnode*

reverse

(listnode *head)

return pre;

}int

main()

劍指offer 鍊錶

單向鍊錶的結構定義 typedef int datatype struct listnode 問題1 往鍊錶的末尾新增乙個結點 給定頭結點,往末尾插入乙個結點 void insertnode listnode head,datatype key listnode p head while p nex...

劍指offer 鍊錶

鍊錶 鍊錶是一種動態資料結構 struct listnode 往鍊錶的末尾新增乙個節點的c 程式如下 void addtotail listnode phead,int value 注意第乙個引數phead是乙個指向指標的指標。當我們往乙個空鍊錶插入乙個結點時,else pnode m pnext ...

劍指offer 鍊錶

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。思路1 遞迴版 class solution 找到當前節點與下乙個節點不重複的點,從不重複的點開始遞迴 return deleteduplication phead next else 思路2 非遞迴版 ...