leetcode初級演算法 鍊錶

2021-10-12 16:31:22 字數 4313 閱讀 6033

(題目源自leetcode,方法都是自(cai)己(ji)寫的,可能比較符合菜雞們的思路)

鍊錶是做到現在,感覺自己最拉垮的一節,資料結構真的都還給老師了

請編寫乙個函式,使其可以刪除某個鍊錶中給定的(非末尾)節點。傳入函式的唯一引數為 要被刪除的節點 。

示例 1:

輸入:head = [4,5,1,9], node = 5

輸出:[4,1,9]

解釋:給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 -> 1 -> 9.

class

solution

:def

deletenode

(self, node)

:"""

:type node: listnode

:rtype: void do not return anything, modify node in-place instead.

"""node.val = node.

next

.val

node.

next

= node.

next

.next

一開始沒看到啥意思,後來發現,給的node,就是讓你刪除的node。。。

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。

示例:

給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.

class

solution

:def

removenthfromend

(self, head: listnode, n:

int)

-> listnode:

len=

0 mid = head

if head.

next

==none

:return head.

next

while mid !=

none

: mid = mid.

next

len=

len+

1 target =

len- n

mid = head

while target >1:

mid = mid.

next

target = target -

1if mid.

next

!=none

and target !=0:

mid.

next

= mid.

next

.next

if target ==0:

head = head.

next

return head

比較蠢的辦法,用了兩次遍歷,第一次算出鍊錶的總長度,第二次,根據n求出正方向遍歷的節點位置,刪掉。

也可以用快慢指標,快指標提前出發n步

或者用迭代回溯,回溯n次

(感覺鍊錶相關的,很多都需要迭代回溯)

反轉乙個單鏈表。

示例:

輸入: 1->2->3->4->5->null

輸出: 5->4->3->2->1->null

class

solution

:def

reverselist

(self, head: listnode)

-> listnode:

if head ==

none

or head.

next

==none

:return head

out = self.reverselist(head.

next

) head.

next

.next

= head

head.

next

=none

return out

使用迭代回溯,這裡注意,其實out自始至終都沒有變過,就是指在了最後乙個node,變得是head.next.next = head,而且head.next一定得擦除,不然會無限迴圈

將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。

示例:

輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

class

solution

:def

mergetwolists

(self, l1: listnode, l2: listnode)

-> listnode:

ifnot l1:

return l2

ifnot l2:

return l1

if l1.val<=l2.val:

l1.next

= self.mergetwolists(l1.

next

,l2)

return l1

else

: l2.

next

= self.mergetwolists(l1,l2.

next

)return l2

明明很簡單,自己想了好久。還是用遞迴,自己在鍊錶的遞迴方面真的太不熟練了

請判斷乙個鍊錶是否為回文鍊錶。

示例 1:

輸入: 1->2

輸出: false

class

solution

:def

ispalindrome

(self, head: listnode)

->

bool

: out =

while head:

head = head.

next

return

true

if out[:]

==out[::

-1]else

false

就是遍歷了鍊錶,把所有的值放進了列表裡,然後判斷列表是否回文。

給定乙個鍊錶,判斷鍊錶中是否有環。

如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。 為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意:pos 不作為引數進行傳遞,僅僅是為了標識鍊錶的實際情況。

如果鍊錶中存在環,則返回 true 。 否則,返回 false 。

高階:你能用 o(1)(即,常量)記憶體解決此問題嗎?

示例 1:

輸入:head = [3,2,0,-4], pos = 1

輸出:true

解釋:鍊錶中有乙個環,其尾部連線到第二個節點。

class

solution

:def

hascycle

(self, head: listnode)

->

bool:if

not head:

return

false

slow = head

quick = head.

next

while slow != quick:

ifnot quick or

not quick.

next

ornot slow.

next

:return

false

slow = slow.

next

quick = quick.

next

.next

return

true

還是用了快慢指標,慢指標走一步,快指標走兩步,兩個指標指向同乙個node,就證明有環。

還可以定義乙個hash={},遍歷鍊錶,把node放進hash表裡,遇到重複的,就證明是有環。

LeetCode 初級演算法 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例 2 輸...

LeetCode初級演算法 鍊錶篇

請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。現有乙個鍊錶 head 4,5,1,9 它可以表示為 示例 1 輸入 head 4,5,1,9 node 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 ...

LeetCode初級演算法之鍊錶 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?思路一 借助外來的空間 這個題我的初步思路是借助外來的空間,也就不是o 1 的空間複雜度,那麼這個就比較簡單了,只...