删除列表的倒数第N个节点

给定一个链表,删除链表的倒数第 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

后来我发现其实我出现前面这个问题的原因是我让两个指针都是从头节点开始的遍历,其实无形之中忽略掉了删除头结点的情况,所以我让他们的初始的节点的往前一个节点问题解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值