题目:
Given the head
of a linked list, remove the nth
node from the end of the list and return its head.
Follow up: Could you do this in one pass?
Example 1:
Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]
Example 2:
Input: head = [1], n = 1 Output: []
Example 3:
Input: head = [1,2], n = 1 Output: [1]
Constraints:
- The number of nodes in the list is
sz
. 1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
算是半个一遍bug free吧,直接想到快慢指针的one pass做法,快指针先走n步,然后两个一起走,需要额外存一个prev,等找到位置就把prev的next连到slow的next上。半个bug free的半个点在于,如果是要remove head,按我的写法需要额外判断是否是remove head,这种情况需要单独处理。看了下solutions直接用dummy head可以解决这个问题,但是那样的话就是返回一个新list而不是对原来的list进行修改(我觉得)。时间复杂度O(n),空间O(1)。
Runtime: 0 ms, faster than 100.00% of Java online submissions for Remove Nth Node From End of List.
Memory Usage: 37 MB, less than 13.62% of Java online submissions for Remove Nth Node From End of List.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = head;
for (int i = 0; i < n; i++) {
fast = fast.next;
}
ListNode slow = head;
ListNode prev = null;
while (fast != null) {
prev = slow;
slow = slow.next;
fast = fast.next;
}
if (prev == null) {
return head.next;
}
prev.next = slow.next;
return head;
}
}