《劍指offer》鍊錶專題 牛客10 23

2022-08-24 02:57:17 字數 3312 閱讀 5242

難度

題目知識點

03. 返回鍊錶的反序 vector

遞迴,c++ stl reverse()

*14. 鍊錶中倒數第k個結點

指標操作

15. 反轉鍊錶

頭插法,遞迴

16. 合併兩個有序鍊錶

指標操作

***25. 複雜鍊錶的複製

深度複製

*36. 兩個鍊錶的第乙個公共結點

棧輔助,鍊錶拼接,鍊錶擷取

***55. 鍊錶中環的入口結點

斷鏈法,快慢指標

*56. 刪除鍊錶中重複的結點

指標操作

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

遞迴或者對正序 vector reverse。

class solution 

};//----------------------vv---------------------------------

class solution

reverse(rst.begin(),rst.end());

return rst;}};

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

這道題去南大面試還被問了,兩個指標的思路不錯,但是涉及指標的細節很多,容易寫崩。。。

/*

首先要判斷指標是否為空,以及k是否大於0!!

然後p1移到最後乙個為止,不能指到空

*/class solution

p1=p1->next;

}while(p1->next != null)

return p2;}};

用頭插法新建了乙個鍊錶。當然不新開鍊錶是可以的,似乎正解也是這樣。。然後遞迴也可以但沒必要。

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

/*

a: 考歸併操作。

t: 要時刻記得指標所指的結點,不要漏掉!

*/class solution else

p3 = p3->next;

p3->next = null;

}if(p1)else if(p2)

return newlist->next;}};

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空。

//2、重新遍歷鍊錶,複製老結點的隨機指標給新結點,如a1.random = a.random.next;

p=phead;

while(p!=null)

//3、拆分鍊錶,將鍊錶拆分為原鍊錶和複製後的鍊錶

p=phead;

q=newhead;

while(p!=null)

return newhead.next;}}

從第乙個公共結點開始,都為公共結點,

我們可以把兩個鍊錶的結點依次壓入到兩個輔助棧中,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出繼續比較下乙個,直到找到最後乙個相同的結點。此方法也很直觀,時間複雜度為o(m+n),但使用了o(m+n)的空間,相當於用空間換區了時間效率的提公升。

具體做法是先求出兩個鍊錶各自的長度,然後將長的鍊錶的頭砍掉,也就是長的鍊錶先走幾步,使得剩餘的長度與短鍊錶一樣長,這樣同時向前遍歷便可以得到公共結點。時間複雜度為o(m+n),不需要額外空間。

將兩個鍊錶進行拼接,乙個鍊錶1在前鍊錶2在後,另乙個鍊錶2在前鍊錶1在後,則合成的兩個鍊錶一樣長,然後同時遍歷兩個鍊錶,就可以找到公共結點,時間複雜度同樣為o(m+n)。

//方法3

class solution

return p1;}};

題目描述

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

採用斷鏈法,訪問過的節點都斷開,最後到達的那個節點一定是迴圈的入口節點。

public class solution 

listnode fast = phead.next;

listnode slow = phead;

while (fast != null)

return slow;}}

利用快慢指標,快指標一次走兩步,慢指標一次走一步,具體思路如下:

①判斷是否有環:若煉表中存在環,快慢指標一定會在環上某一點相遇(因為相對速度為1);

②確定環的起點:

​ 設x為環前面的路程(黑色路程),a為環入口到相遇點的路程(藍色路程,假設順時針走),c為環的長度(藍色+橙色路程)。則有

​ 可得x = c - a,即相遇點後環剩餘部分的路程。所以,我們可以讓乙個指標從鍊錶起點開始走,讓乙個指標從相遇點開始繼續往後走,倆指標會在環的起點相遇。

public class solution  else

}//迴圈出來的話就是有環,且此時fast==slow,快慢指標在相遇點

fast=phead;

while (fast!=slow)

return slow;}}

題目描述:

在乙個排序的鍊錶中,存在連續重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。

例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5

很容易寫錯了。

public class solution 

pre.next=cur.next;

}else

}return newhead.next;}}

牛客網劍指offer反轉鍊錶 python實現

1.首先看一下鍊錶的資料結構 鍊錶由節點構成,每個節點包含兩個部分,第一部分是資料,第二部分是鏈結資料的儲存位置資訊。如 第乙個節點儲存了資料 1 第二部分儲存了後面乙個資料 2 的儲存位置資訊。最後乙個節點是none。2.python實現鍊錶反 coding utf 8 class listnod...

牛客《劍指Offer》 從尾到頭列印鍊錶

輸入乙個鍊錶,從尾到頭列印鍊錶每個節點的值。依次從頭取出鍊錶上的節點,將遍歷的節點依次插入到向量的首部,從而實現鍊錶的翻轉。筆記 1.vector使用 1.宣告與定義 vectorivec 2.頭插入vector ivec.insert ivec.begin 6 struct listnode cl...

牛客 劍指offer 判斷鍊錶是否有環

題目 判斷鍊錶是否有環 思路 雙指標。快指標每次走2步,慢指標每次走一步。如果有環,二者必定相遇 如果沒環,快指標必定率先到達鍊錶尾部。definition for singly linked list.class listnode public class solution listnode lo...