1. 程式人生 > 其它 >[LeetCode] #19 刪除連結串列的倒數第 N 個結點

[LeetCode] #19 刪除連結串列的倒數第 N 個結點

[LeetCode] #19 刪除連結串列的倒數第 N 個結點

給你一個連結串列,刪除連結串列的倒數第n個結點,並且返回連結串列的頭結點。

輸入:head = [1,2,3,4,5], n = 2

輸出:[1,2,3,5]

先遍歷一遍獲得長度,再遍歷一遍找到要刪除的節點

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        int length = getLength(head);
        ListNode cur = dummy;
        
for (int i = 1; i < length - n + 1; ++i) { cur = cur.next; } cur.next = cur.next.next; ListNode ans = dummy.next; return ans; } public int getLength(ListNode head) { int length = 0; while (head != null) { ++length; head
= head.next; } return length; } }

使用棧

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        Deque<ListNode> stack = new LinkedList<ListNode>();
        ListNode cur = dummy;
        while
(cur != null) { stack.push(cur); cur = cur.next; } for (int i = 0; i < n; ++i) { stack.pop(); } ListNode prev = stack.peek(); prev.next = prev.next.next; ListNode ans = dummy.next; return ans; } }

只遍歷一次

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        ListNode first = head;
        ListNode second = dummy;
        for (int i = 0; i < n; ++i) {
            first = first.next;
        }
        while (first != null) {
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
        ListNode ans = dummy.next;
        return ans;
    }
}

知識點:

總結: