https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/
题意:删去一个链表的倒数第n个结点。
思路:设两个指针i和j,i比j往前走n步,然后i和j每次向前走1步,这样当i走到尽头时,j恰好指向倒数第n个结点。然而题目中要的是删去,所以应该找倒数第n个的前驱,即倒数第n+1。找到后用链表操作跨过倒数第n即可。
边界条件:倒数第1个和倒数第n个(设链表长度为n)。对于第1个,1+1=2,可以到达。对于第n个,n+1>n,超出链表长度。这里用个技巧,在链表头部加一个辅助用的头结点,这样就能解决倒数第n(即正数第一个)的情况。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
newHead = ListNode(0) #设辅助头结点,val为0(随意设,用不着)
newHead.next = head #链上要处理的链表
i = newHead #起始
count = 0
while i: #i先向前走n+1步
if count == n+1:
break;
i = i.next
count += 1
j = newHead #j开始走
while i:
i = i.next
j = j.next
j.next = j.next.next #j为要删除的结点p的前驱
return newHead.next #辅助结点不计入结果