難度
題目知識點
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...