随笔 - 112  文章 - 0  评论 - 0  阅读 - 1312

删除链表的倒数第n个节点(逆置链表)

  • 描述
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,
给出的链表为: 12345,n=2.
删除了链表的倒数第 n 个节点之后,链表变为1235.
 
数据范围: 链表长度 0n1000,链表中任意节点的值满足 0val100
要求:空间复杂度 O(1),时间复杂度 O(n)
备注:
题目保证n 一定是有效的
 
  • 示例
输入:{1,2},2
输出:{2} 
 
  • 算法思想
先将链表逆置,采用头插法的思想逆置链表,然后删除正数第n个节点,最后再将链表逆置并返回
 
代码 
复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverse(ListNode *head){
        ListNode *pre = new ListNode();
        ListNode *p = head;
        ListNode *r;
        while(p){
            r = p->next;
            p->next = pre->next;
            pre->next = p;
            p = r;
        }
        return pre->next;
    }
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(head->next==nullptr) return nullptr;
        ListNode *h = reverse(head);
        ListNode *p = h;
        ListNode *pre = new ListNode();//头结点
        pre->next = p;
        //删除第n个节点
        while(n>1){
            pre=p;
            p=p->next;
            n--;
        }
        if(pre->next == h){//如果删除的是第一个结点,要逆置的链表的第一个节点就不是h
            pre->next = p->next;
            delete p;
            return reverse(pre->next);
        }
        pre->next = p->next;
        delete p;
        return reverse(h);
    }
};
复制代码

 

 

  
 
 
posted on   _月生  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示