876. 鏈表的中間結點
.
給定一個帶有頭結點 head 的非空單鏈表,返回鏈表的中間結點。如果有兩個中間結點,則返回第二個中間結點
示例 1:
輸入:[1,2,3,4,5] 輸出:此列表中的結點 3 (序列化形式:[3,4,5]) 返回的結點值爲 3 。
(測評系統對該結點序列化表述是 [3,4,5])。 注意,我們返回了一個 ListNode 類型的對象 ans,這樣: ans.val =
3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
輸入:[1,2,3,4,5,6] 輸出:此列表中的結點 4 (序列化形式:[4,5,6]) 由於該列表有兩個中間結點,值分別爲 3 和
4,我們返回第二個結點
一道非常簡單的鏈表題(有點過於簡單了,,)開始的時候想的是先遍歷一遍鏈表,得到鏈表的長度從而得到中值位置,然後再遍歷到中止就可以了
代碼如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
c=head
count=1
half=1
while(c.next!=None):
c=c.next
count=count+1
count=(count)//2+1
c=head
while(half!=count):
c=c.next
half=half+1
return c
後來改進的時候發現在第一遍遍歷是可以用一個順序表存進去,這樣每個節點和他的位置就是一一對應的關係,不用第二次遍歷就能提取中值了,不過這種方法要注意特殊值
代碼如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
a=[]
if(head.next==None):
return head
while(head!=None):
a.append(head)
head=head.next
return a[(len(a))//2]
一道輕鬆的小題開啓了繁忙的一天~