给定一个链表,删除链表的倒数第 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 # 跳过我们之前添加的头