19. 删除链表的倒数第 N 个结点

——————————————————— 原来这世上,比之成双鸳侣,多的却是相思枉然 ———————————————————

题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

19. 删除链表的倒数第 N 个结点_第1张图片

两种解法,首先是简单的:计算出整个链表的长度 M,然后从头开始数到第 M-N-1 个节点即可。这个节点是需要删除节点的前一个节点,然后将要删除节点的下一个节点连接到这个节点上。
然后是使用快慢两个指针,快指针提前走 N 步,然后快慢指针一起移动,当快指针指向 NULL 时,慢指针指向待删除节点。注意,这里也需要指向待删除节点的前一节点。

// java
/**
 * 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) {
        if (head == null) {
            return null;
        }
        ListNode node = head;
        int count = 1;
        while (node.next != null) {
            node = node.next;
            ++count;
        }
        int m = count - n;
        if (m == 0) {
            return head.next;
        }
        node = head;
        for (int i = 1; i < m; i++) {
            node = node.next;
        }
        if (node.next == null) {
            return head;
        }
        node.next = node.next.next;
        return head;
    }
}

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if (head == null) {
            return null;
        }
        ListNode fast = head, slow = head;
        while (fast != null && n-- > 0) {
            fast = fast.next;
        }
        if (fast == null) {
            return head.next;
        }
        while (fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return head;
    }
}
// cpp
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if (head == nullptr)
            return nullptr;
        ListNode *slow = head, *fast = head;
        while (n+1){
            if (fast == nullptr)
                return head->next;
            fast = fast->next;
            --n;
        }
        while(slow != nullptr && fast != nullptr){
            slow = slow->next;
            fast = fast->next;
        }
        slow->next = slow->next->next;
        return head;
    }
};

你可能感兴趣的:(Andy,的刷题记录,链表,数据结构)