C++ 链表题

本文介绍了如何实现链表的反转、删除倒数第N个节点、合并两个有序链表、检测环形链表、两数相加以及合并两个已排序链表,并提供了相应的代码示例。
摘要由CSDN通过智能技术生成

1. 反转链表

问题描述: 实现一个函数,反转一个单链表。

详细解析:

  1. 初始化三个指针:prev(指向前一个节点),curr(当前节点),next(下一个节点)。
  2. 遍历链表,对于每个节点,先保存其下一个节点,然后将其next指针指向prev
  3. 移动prevcurr指针:将prev移动到curr,将curr移动到next
  4. currNULL时,链表遍历完成,prev即为反转后的链表的新头节点。

答案:

struct ListNode {
   
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr)};

ListNode* reverseList(ListNode* head) {
   
    ListNode* prev = nullptr;
    ListNode* curr = head;
    while (curr) {
   
        ListNode* next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}

2. 删除链表的倒数第N个节点

问题描述: 给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。

详细解析:

  1. 创建一个哑节点(dummy node),它的next指针指向链表的头节点。这样可以方便地处理删除头节点的情况。
  2. 使用两个指针firstsecond,初始时都指向哑节点。
  3. 移动first指针,使得firstsecond之间相隔n个节点。
  4. 同时移动firstsecond指针,直到first指向链表末尾。
  5. 此时secondnext指针指向的节点就是要删除的节点,调整secondnext指针,跳过下一个节点即可。

答案:

ListNode* removeNthFromEnd(ListNode* head, int n) {
   
    ListNode* dummy = new ListNode(0);
    dummy->next = head;
    ListNode* first = dummy;
    ListNode* second = dummy;
    
    // 移动first,使得first和second之间相隔n个节点
    for (int i = 1; i <= n +
  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值