LeteCode:19. 删除链表的倒数第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

题解:

纪念下第一次做到关于列表的题目,其实这个概念不是很熟悉,一直很抽象,做完这道题之后心中大概有了个把握。
链表这里其实就是多个字典组合,而这个字典的next指向的是下一个Node(字典)
{val:1,next:{val:2,next:{val:3,next:None}}} 表示:1->2->3的列表
思路1:先遍历一遍,得到列表长度
在遍历到需要删除节点的上一个节点,将该节点的next指向下个节点的next(即跳过需要删除的节点)

思路2:一次遍历,设置双指针,指针保持n-1的间隔,同时移动两个指针,当右指针到达末尾,左指针的下一个node就是需要删除的node,将左指针的next指向下个节点的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:
        ## 采用双指针的思想可以达到一次遍历
        # 左右指针保持n+1的距离,当右指针到头时,左指针的下一位就是需要删除的节点
        dump=ListNode(0) # 给链表加头,应对删除第一个节点的特殊情况发生
        dump.next=head
        right=dump
        left=dump
        val=0
        while(val<n+1):
            val+=1
            right=right.next  # 右指针先移动n+1次
        while(right!=None): # 同时移动
            left=left.next
            right=right.next
        left.next=left.next.next # 左指针跳过下一个node
        return dump.next # 跳过我们之前添加的头
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值