力扣-19-删除链表的倒数第 N 个结点

88 阅读1分钟

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

给你一个链表,删除链表的倒数第 n **个结点,并且返回链表的头结点。   示例 1:

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

示例 2:

输入: head = [1], n = 1
输出: []

示例 3:

输入: head = [1,2], n = 1
输出: [1]

方法一:计数

思路:

1、额定链表长度

2、寻找要删除结点的前一个结点

3、进行删除操作

4、边界处理:可以添加虚拟头结点,也可以当独对链表只有一个结点或要删除结点为第一个结点处理

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int cnt=0,s;
        ListNode *p=head;
        while(p){
            p=p->next;
            cnt++;
        }
        if(cnt==1){
            return nullptr;
        }
        if(cnt==n){
            return head->next;
        }
        p=head;
        s=cnt-n;
        while(--s){
            p=p->next;
        }
        p->next=p->next->next;
        return head;
    }
};

方法二:双指针

思路:

1、指针p、q指向头结点

2、移动q,使q与p之间有n个结点

3、同时向后移动p、q,当q为空时停止移动,此时p指向的结点便是待删除结点的前一个节点

4、进行删除操作

5、边界处理,同方法一

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummyhead=new ListNode(0,head);
        ListNode *p=dummyhead,*q=dummyhead;
        ++n;
        while(n--){
            q=q->next;
        }
        while(q){
            p=p->next;
            q=q->next;
        }
        p->next=p->next->next;
        return dummyhead->next;
    }
};