目录
876. 链表的中间结点
思路:
1.两次遍历,第一次确定长度,第二次返回中间节点
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:
p = head
q = head # 快慢
n = 0
while p:
n += 1
p = p.next
if n % 2 == 0:
q = q.next
return q
19. 删除链表的倒数第 N 个结点
思路:
1.快慢指针,慢的比快的慢k + 1个节点
2.快指针到达尾端的时候慢指针刚好到达要删除节点的前置节点,此时修改即可
3.需要哑节点,因为可能删除第一个元素
代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
if head == None:
return head
p = head
q = bad_head = ListNode(0, head)
k = 1
while p:
k += 1
p = p.next
if k > n + 1:
q = q.next
q.next = q.next.next
return bad_head.next #要返回哑节点的下一个一个
以上
坚持 共勉