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


    给定一个链表,删除链表的倒数第 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;
    }

  • 相关阅读:
    libiconv2.dll
    windows下安装,配置gcc编译器
    STM32之DMA
    keilkill.bat
    STM32之系统滴答定时器
    STM32库函数开发使用总结
    STM32之串口通信
    yocto系统介绍
    fork子进程僵尸问题及解决方案
    shell实现的守护进程
  • 原文地址:https://www.cnblogs.com/biat/p/10525077.html
Copyright © 2020-2023  润新知