【LeetCode】19. 删除链表的倒数第N个节点

链接:

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list

描述:

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

示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:
给定的 n 保证是有效的。

进阶:
你能尝试使用一趟扫描实现吗?

ListNode* removeNthFromEnd(ListNode* head, int n) {}

思路:

设置两个指针,中间相隔 \(n\) 个元素
之后,两指针共同前进,直到右边指针的下一步为空指针
删除前面指针的下一个元素,即可

注意:使用哑节点(dummy node),避免特殊情况

C++

展开后查看
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummyHead = new ListNode(-1);
        dummyHead->next = head;
        ListNode *left = dummyHead, *right = dummyHead;
        while(n--){
            right = right->next;
        }
        while(right->next != NULL){
            right = right->next;
            left = left->next;
        }
        ListNode *deleteNode = left->next;
        left->next = deleteNode->next;
        delete deleteNode;
        ListNode *result = dummyHead->next;
        delete dummyHead;
        return result;
    }
};

Java

展开后查看
/**
 * 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 dummyHead = new ListNode(-1);
        dummyHead.next = head;
        ListNode left = dummyHead, right = dummyHead;
        while(n-- != 0){
            right = right.next;
        }
        while(right.next != null){
            right = right.next;
            left = left.next;
        }
        left.next = left.next.next;
        return dummyHead.next;
    }
}
posted @ 2020-06-19 15:29  CrazyBlogs  阅读(54)  评论(0编辑  收藏  举报