https://leetcode.cn/problems/SLwz0R/
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
难度:☆☆☆
题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1], n = 1
输出:[]
输入:head = [1,2], n = 1
输出:[1]
方法:链表,快慢双指针
第一步:快指针先向前走n步。
第二步:快指针和慢指针同时同步走,走到底。此时慢指针的下一个节点就是要删除的节点。
第三步:慢指针指向下下节点,完成删除。
注意,由于链表发生变动,有节点被删除,需要用到哑节点。
Python
时间复杂度:O(n)。
空间复杂度:O(1)。
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
dummy = ListNode()
dummy.next = head
slow, fast = dummy, dummy
while n > 0:
fast = fast.next
n -= 1
while fast and fast.next:
slow = slow.next
fast = fast.next
slow.next = slow.next.next
return dummy.next
Java
时间复杂度:O(n)。
空间复杂度:O(1)。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode fast = dummy;
ListNode slow = dummy;
while (n > 0) {
fast = fast.next;
n--;
}
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return dummy.next;
}
}
标签:dummy,head,slow,LCR,主站,fast,next,链表,ListNode
From: https://blog.csdn.net/weixin_43606146/article/details/143901130