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

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

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

允许反馈(两趟扫描)就是计数,不多赘述

一趟扫描:双指针法:先来个先驱指针pioneer   pt1,从head起走上n步,再从头来个指针pt2和他一块走,走到pt1->next==NULL,这样两个指针中间查了n-1个节点,要删除的就是pt1->next节点,用pt1->next=pt1->next->next,但是但是但是!!!如果我pioneer走n步就tm走到NULL了怎么办,想想没毛病,n是链表长度的话,就是删除头节点,就没法用pt1->next判决循环条件了,并且删除的也是*pt2而不是*(pt2->next),我们就在循环开始加个判断pt1是不是NULL,如果NULL,return个head->next就完事了。

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode*pt1=head,*pt2=head;
        for(int i=0;i<n;i++)pt1=pt1->next;
        if(pt1==NULL) return pt2->next;
        else{
            while(pt1->next!=NULL){
                pt1=pt1->next;
                pt2=pt2->next;
            }
            pt2->next=pt2->next->next;
            return head;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/HeXiQuan123/article/details/82380849