题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1], n = 1
输出:[]
解法一
先遍历一遍得到链表长度,再从头遍历删除
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
x=head
length=0
while x!=None:
length+=1
x=x.next
p=length-n
length=0
x=head
if p == 0:
head=head.next
while x!=None:
length+=1
if length==p:
x.next=x.next.next
x=x.next
return head
解法二
题目中说“你能尝试使用一趟扫描实现吗?”
可以使用先后指针的方法,两指针相差为n,其中一个指针到达末尾时,另一个就指向倒数第n个数。
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
cur=ListNode(0,head)
s=head
f=cur #这里是防止f.next.next不存在
for i in range(n):
s=s.next
while s!=None:
f=f.next
s=s.next
f.next=f.next.next
return cur.next