给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
在真实的面试中遇到过这道题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
# 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:
p=ListNode(-1)
p.next,a,b=head,p,p
k=0
while a.next!=None:
a,k=a.next,k+1
if k<n:
return head
while k-n>0:
b,k=b.next,k-1
b.next=b.next.next
return p.next
# 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:
p=ListNode(-1)
p.next,a,b=head,p,p
while n>0 and a:
a,n=a.next,n-1
if not a:
return head
while a.next!=None:
a,b=a.next,b.next
b.next=b.next.next
return p.next
这道题删除节点的很简单,我们需要考虑的是如何找到倒数第N个节点,有两种方法
1.先遍历一遍,得到链表的长度,进而得到倒数第N个节点的位置。
2.设置快慢指针,一个快的指针先移动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: ListNode, n: int) -> ListNode:
fast=head
slow=head
for i in range(n):
fast=fast.next
if fast==None:
return head.next
while fast.next:
fast=fast.next
slow=slow.next
slow.next=slow.next.next
return head
看到题目第一反应就是一个删除链表,我们真正要解决的问题其实就是找到要被删除的那个节点的index ,应为他告诉了,该节点是倒数第n个节点,所以我们找一个指针让他先走n步,然后另一个指针在开始走,当第一个指针到尾部的时候其实slow的指针前面一个位置就是index 的位置,然后删除节点返回即可。
但是这个地方其实有个小坑,就是当n等于length(链表的长度的时候),fast直接就是None了,在这时候slow其实才是那个需要删除的节点,所以我一开始就直接接在第一个for 循环之后加了一个判断直接return head.next解决问题。
# 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:
root =ListNode(-1)
root.next=head
fast=root
slow=root
for i in range(n):
fast=fast.next
# if fast==None:
# return head.next
while fast.next:
fast=fast.next
slow=slow.next
slow.next=slow.next.next
return root.next
后来我发现其实我出现前面这个问题的原因是我让两个指针都是从头节点开始的遍历,其实无形之中忽略掉了删除头结点的情况,所以我让他们的初始的节点的往前一个节点问题解决。