鍊錶 在節點間穿針引線

2021-10-04 11:07:26 字數 3521 閱讀 8231

例題:反轉鍊錶

反轉鍊錶原理很簡單,就是將原本指向下乙個結點的指標,指向上乙個結點。但是,需要儲存前面和後面的結點,要不就找不到了。

所以使用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.nextcur都有可能為null,所以一定要判斷好。

給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。

你應當保留兩個分割槽中每個節點的初始相對位置

這個題乍一看像是一遍快排,但實際上又不是,因為這是個鍊錶,而且還需要保留相對位置。那麼其實我們只需要新建兩個鍊錶,乙個用來儲存比x小的,乙個用來儲存比x大的,最後將它們拼接不就好了。

思路確定,剩下的就是細節了。首先需要新建兩個結點作為鍊錶虛擬頭結點,然後再用兩個指標分別指向兩個鍊錶最末端的元素。

**最需要注意的!!!**在最後一定要把rpointnext設為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;

}

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

思路很簡單,因為是逆序,所以設定乙個進製c,用來表示從上一位進來的值。然後將當前的兩個結點值和進製相加,得到的值進製或者不進製。需要注意的點有:

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;

}}

給定兩個非空鍊錶來代表兩個非負整數。數字最高位位於鍊錶開始位置。它們的每個節點只儲存單個數字。將這兩數相加會返回乙個新的鍊錶。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 高階: 如果輸入鍊錶不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。

這個題難得的一次ac無任何錯誤,其實這個題歸根結底和上乙個差不多,只是順序倒過來了而已。所以其實只要再倒回來就行了,但是題目要求不能修改鍊錶。那麼,對於倒轉有乙個強大的資料結構——棧。利用棧便可以輕鬆實現反轉操作,且不修改鍊錶。

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的下乙個節點有了兩個一摸一樣的節點儲存它的資訊,...