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

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

问题描述

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?

问题分析

这是一道关于双指针的典型应用,先让快指针跑n步,接着让快指针和慢指针一起跑,然后删除相应的元素即可,只不过要注意要删除的元素是哪个。另外刚开始我直接在head上开始做,结果在链表只有一个元素和两个元素上出错了,需要加一些判定条件,看了大神们的解答,另一个新的节点的下一个节点指向head,则只需要考虑节点只有一个的情形就行了,即下面代码中的if(fast == NULL)return head->next;因为如果跑n步fast节点到头了,说明要删除的就是开头的节点。

代码

/**
 * 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 *tmp = new ListNode(0);
        tmp->next = head;//保证了要搜索的链表至少有一个元素
        ListNode *fast = tmp,*slow = tmp;
        while(n > -1 && fast != NULL)
        {
            fast = fast->next;
            --n;
        }
        if(fast == NULL)return head->next;
        while(fast != NULL)
        {
            fast = fast->next;
            slow = slow->next;
        }
        slow->next = slow->next->next;
        delete tmp;
        return head;
    }
};
posted @ 2019-11-24 10:45  曲径通霄  阅读(86)  评论(0编辑  收藏  举报