欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

#leetcode刷题之路19-删除链表的倒数第N个节点

程序员文章站 2022-04-28 14:01:10
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。 思路: 1.先让end指针向前走(n-1),这样的话就可以让end和fir ......

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。

 

 思路:

1.先让end指针向前走(n-1),这样的话就可以让end和first之间出现(n-1)的间隔,

2.让end和first一起向后走,直到end到头了,此时first就是倒数第n个数

3.再让temp走到first之前,用(temp->next=first->next;)来跳过first,再释放first,

4.代码中考虑了集中极端的情况。

#include <iostream>
using namespace std;
struct listnode {
        int val;
        listnode *next;
        listnode(int x) : val(x), next(null) {}
    };


listnode* createlist(int n)
{
    listnode *head = (listnode*)malloc(sizeof(listnode));
    listnode *pre = head;
    for (int i = 0; i < n; i++)
    {
        listnode *p = (listnode*)malloc(sizeof(listnode));
        cin >> p->val;
        pre->next = p;
        pre = p;
    }
    pre->next = nullptr;
    return head;
}


listnode* removenthfromend(listnode* head, int n) {
    listnode *temp=head;
    listnode *first=head;
    listnode *end=head;
    if((temp->next)==nullptr) return nullptr;
    if(n==1)
    {
        while(end->next->next!= nullptr)
        {
            end=end->next;
        }
        temp=end->next;
        temp=nullptr;
        free(temp);
        end->next=nullptr;
        return head;
    }

    while((n-1)!=0)
    {
        n--;
        end=end->next;
    }
    //cout<<end->val<<endl;
    while(end->next!= nullptr)
    {
        first=first->next;
        end=end->next;
    }
    if(temp==first) return first->next;
    //cout<<"first"<<first->val<<endl;
    //cout<<end->val<<endl;
    while((temp->next!=first))
    {
        temp=temp->next;
    }
    //cout<<temp->val<<endl;
    temp->next=first->next;
    first=nullptr;
    free(first);
    return head;
}

int main() {
    listnode* head=createlist(5);
    listnode *ans=removenthfromend(head,3);
    ans=ans->next;
    while(ans!= nullptr)
    {
        cout<<ans->val<<endl;
        ans=ans->next;
    }
    return  0;
}