(題目源自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 的空間複雜度,那麼這個就比較簡單了,只...