题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
思路一和思路二都添加了哑节点作为辅助。如果没有哑节点,对于只有head,则很难删除这个节点。设置dummy.next = head; dummy.next =None,同时返回dummy.next
时隔半年再看这道题,突然明白。
①dummy的意义在于如果删除头节点,怎么使用
②算上dummy节点,first节点先走n+1步,保证了first和second之间有n步的差距
③first走到最后,相当于second和末尾空节点有n步个距离,即second还有n步走到最后,比如说还有2步,那么second就是倒数第三步,则下一步就是倒数第二步
思路一:双指针方法
# 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:
dummy = ListNode(0)
dummy.next = head
first , second = dummy , dummy
for i in range(n+1):
first = first.next
while first is not None:
first = first.next
second = second.next
second.next = second.next.next
return dummy.next
参考链接
推荐使用双指针方法
思路二,根据first指针从head到末尾空指针,得到链表的长度,然后将长度-n得到正向要达到的节点。
# 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:
dummy = ListNode(0)
dummy.next = head
length = 0
first = head
while first is not None:
length +=1
first = first.next
length -=n
first = dummy
while length>0:
length -=1
first = first.next
first.next = first.next.next
return dummy.next