例題:反轉鍊錶
反轉鍊錶原理很簡單,就是將原本指向下乙個結點的指標,指向上乙個結點。但是,需要儲存前面和後面的結點,要不就找不到了。
所以使用pre cur next
三個結點,儲存著上乙個結點、當前結點、下乙個結點,然後一起向後遍歷。在這期間,最需要注意的就是順序以及邊界。
class solution
cur.
next
= pre;
return cur;
}}
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。草草在紙上畫了一下,基本上弄清楚大概的思路了。還是和例題一樣,用那三個指標。說明: 1 ≤ m ≤ n ≤ 鍊錶長度。
示例: 輸入: 1->2->3->4->5->null, m = 2, n = 4
輸出: 1->4->3->2->5->null
這次,我們使用乙個計數器,來判斷迴圈的次數,當它到達m和n的時候,分別作出對應操作:
從頭到尾只進行了一趟掃瞄,所以時間複雜度為o(n)。
class
solution
listnode first = pre;
//記錄之後要用到的結點
listnode second = cur;
while
(numcur.next = pre;
if(first!=null) first.next = cur;
second.next = next;
return m==
1?cur:head;
//m等於1,說明頭結點變了,要以cur作為頭結點
}}
給定乙個排序鍊錶,刪除所有重複的元素,使得每個元素只出現一次。乍一看思路很明顯,因為是排序的,所以只需要比較下乙個結點是否和當前結點值相等,相等next便指向下下個結點,然後再判斷,知道與下乙個結點值不同,再繼續向下遍歷。
class
solution
cur = cur.next;
}return head;
}}
but,要注意邊界條件。畢竟在向後跳的時候,cur.next
和cur
都有可能為null,所以一定要判斷好。
給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。這個題乍一看像是一遍快排,但實際上又不是,因為這是個鍊錶,而且還需要保留相對位置。那麼其實我們只需要新建兩個鍊錶,乙個用來儲存比x小的,乙個用來儲存比x大的,最後將它們拼接不就好了。你應當保留兩個分割槽中每個節點的初始相對位置。
思路確定,剩下的就是細節了。首先需要新建兩個結點作為鍊錶虛擬頭結點,然後再用兩個指標分別指向兩個鍊錶最末端的元素。
**最需要注意的!!!**在最後一定要把rpoint
的next
設為null
,要不然會形成環。
時間複雜度:o(n)。
class
solution
else
cur = cur.next;
} rpoint.next = null;
lpoint.next = right.next;
return left.next;
}}
給定乙個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o(1),時間複雜度應為 o(nodes),nodes 為節點總數。
class
solution
opoint.next = even;
return head;
}
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。思路很簡單,因為是逆序,所以設定乙個進製c,用來表示從上一位進來的值。然後將當前的兩個結點值和進製相加,得到的值進製或者不進製。需要注意的點有:如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
class
solution
else
listnode temp =
newlistnode
(val)
; np.next = temp;
np = np.next;
if(l1!=null) l1 = l1.next;
if(l2!=null) l2 = l2.next;
}return newlist.next;
}}
給定兩個非空鍊錶來代表兩個非負整數。數字最高位位於鍊錶開始位置。它們的每個節點只儲存單個數字。將這兩數相加會返回乙個新的鍊錶。這個題難得的一次ac無任何錯誤,其實這個題歸根結底和上乙個差不多,只是順序倒過來了而已。所以其實只要再倒回來就行了,但是題目要求不能修改鍊錶。那麼,對於倒轉有乙個強大的資料結構——棧。利用棧便可以輕鬆實現反轉操作,且不修改鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 高階: 如果輸入鍊錶不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。
class
solution
while
(l2!=null)
listnode newlist = null;
int c =0;
while
(!s1.
empty()
||!s2.
empty()
|| c!=0)
else
listnode temp =
newlistnode
(val)
; temp.next = newlist;
newlist = temp;
}return newlist;
}}
69 在O 1 時間刪除鍊錶節點
對於刪除鍊錶節點需要考慮的問題 鍊錶為空時?刪除頭節點時?刪除尾節點時?要在o 1 o 1 的時間複雜度內刪除節點,那只能採用特殊辦法了 對於頭節點,很容易完成,因為它沒有前驅 對於中間節點,只能是把待刪除節點改造成其後繼節點,然後刪除後繼節點了,這樣值是相等的,但是確實不是同乙個節點 對於尾節點,...
在O 1 時間複雜度刪除鍊錶節點
給定乙個單鏈表中的乙個等待被刪除的節點 非表頭或表尾 請在在o 1 時間複雜度刪除該鍊錶節點。給定1 2 3 4,和節點3,刪除 3之後,鍊錶應該變為1 2 4。因為給定節點在鍊錶的中間,所以不可能用一步步迭代找到這個節點的前驅,那就得換個思路來思考這個問題。題目並未說不可以更改節點的元素,所以可以...
在O 1 時間複雜度刪除鍊錶節點
題目 給定乙個單鏈表中的乙個等待被刪除的節點 非表頭或表尾 請在在o 1 時間複雜度刪除該鍊錶節點。思路 給定乙個節點的地值node,想要將它刪除,最好的方法就是下乙個節點覆蓋這個節點,這個節點的資訊就不存在了,就相當於刪掉了這個節點。如此一來node的下乙個節點有了兩個一摸一樣的節點儲存它的資訊,...