给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
分析
解法1
- 将链表中的数按顺序存入一个列表
- 找到要删除节点的索引
- 遍历到该节点 删除之
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
if head == None:
return None
# l 按顺序存入链表中的数
l = []
cur = head
while cur is not None:
l.append(cur.val)
cur = cur.next
if n == len(l):
return head.next
# num 表示cur目前的索引
num = 0
cur = head
# pre 指向cur的前一个节点
pre = None
# m 表示要删除节点的索引
m = len(l) - n
# cur 指向要删除节点
while num < m:
num += 1
pre = cur
cur = cur.next
pre.next = cur.next
return head
解法2
- 双指针p q 都指向头节点
- 一个指针先往后移动N个位置 这样两指针相距N
- 同时移动两指针 直到后面的指针移动到尾部 这样前面的指针指向即为倒数第N个节点的前一个节点
- 注意特殊情况 若q已经指向None 则删除节点为头节点
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
if head == None:
return None
p = head
q = head
q_num = 0
while q_num < n:
q = q.next
q_num += 1
if q is None:
return head.next
while q.next is not None:
p = p.next
q = q.next
p.next = p.next.next
return head