题目连接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/java
给定一个链表,删除链表的倒数第 n 个节点,而且返回链表的头结点。node
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
使用快慢指针,python
快指针先移n
个节点spa
接下来,快慢指针一块儿移动,两指针之间一直保持n
个节点,当快指针到链表底了,操做慢指针,删除要删除的元素!指针
时间复杂度:\(O(n)\)code
关注个人知乎专栏,了解更多解题方法!leetcode
# 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: if not head:return dummy = ListNode(0) dummy.next = head fast = dummy while n: fast = fast.next n -= 1 slow = dummy while fast and fast.next: fast = fast.next slow = slow.next slow.next = slow.next.next return dummy.next
javarem
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode slow = dummy; ListNode fast = dummy; for (int i = 0 ; i < n; i ++ ){ fast = fast.next; } while(fast != null && fast.next != null){ slow = slow.next; fast = fast.next; } slow.next = slow.next.next; return dummy.next; } }