返回链表倒数第N个结点有两种方法,第一种方法是遍历两次链表,第一次遍历求链表长度,第二次遍历找到倒数第N个结点前一个结点,最后将该结点的next结点更换至next结点的next结点即可。第二种方法则只需要遍历一次链表,但需要设置两个指针,一前一后,指针间隔即为n,当后指针为None时说明已至链尾,此后修改前指针的next指向即可。本文推荐用解法二,但附上两种解法代码。
示例1:
图1 删除链表结点前后对比
方法一:
需遍历两次链表
class Solution:
def removeNthFromEnd(self, head, n):
dummy = ListNode(0, head)
length = self.getLength(head)
cur = dummy
for i in range(length - n):
cur = cur.next
cur.next = cur.next.next
return dummy.next
def getLength(self, head):
length = 0
while head:
length += 1
head = head.next
return length
方法二:
需要两个指针
class Solution:
def removeNthFromEnd(self, head, n):
dummy = ListNode(0, head)
dummy.next = head
first = dummy
second = dummy
for i in range(n + 1):
first = first.next
while first:
first = first.next
second = second.next
second.next = second.next.next
return dummy.next
注意:
1)前后两个指针需要间隔n个结点:
for i in range(n + 1):
first = first.next
range(n)为一个半开半闭区间,故这里firsr指针要想先走n步需要range(n+1)