Leetcode876-链表的中间结点
思路1: 先计算出链表的长度,然后找到中间位置,从而得到中间节点。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
count = 0 #计数器
cur = head #暂存,因为在计算链表长度的时候head会变化
while head: #遍历
head = head.next
count += 1
target = count // 2 #取中间位置
for i in range(target):
cur = cur.next
return cur
思路2: 双指针,快慢指针。
慢指针每走一步,快指针走两步,当快指针走到末尾的时候,慢指针刚好走到中间位置。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow