一篇玩转链表

前言

       C++中链表因为涉及指针的使用,所以一直是一大难题。本篇文章中将讲解如何使用快慢指针法得到链表中点,及链表的倒置操作。相信在本篇文章后你将了解这些用法。


传说门


提示:以下是本篇文章正文内容

一、直观做法

(一)线性表存储

转为线性表后,可以方便使用索引获得元素。但缺点是,空间复杂度会到达O(n)。另外,因为本文主要讲解链表操作,略过不提

(二)链表中点+后半部分链表倒置+链表融合

以样例为例。

输入 1 -> 2 -> 3 -> 4
链表中点 2
后半部分链表首节点:3(链表中点的后一个节点)
后半部分链表倒置 4 -> 3
链表合并 1 -> 4 -> 3 -> 2
输入 1 -> 2 -> 3 -> 4 -> 5
链表中点 3
后半部分链表首节点:4(链表中点的后一个节点)
后半部分链表倒置 5 -> 4
链表合并 1 -> 5 -> 2 -> 4 -> 3

二.代码

(一)快慢指针法得链表中点

/*快慢指针法找链表中点*/
    ListNode* findMid(ListNode* head){
        ListNode* slow = head;
        ListNode* fast = head;
        while(fast -> next != nullptr && fast -> next -> next != nullptr){
            slow = slow -> next;
            fast = fast -> next -> next;
        }
        return slow;
    }
输入 1 -> 2 -> 3 -> 4
链表中点 2

(二)链表倒置

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

倒置链表的思想是从前向后遍历,把每一个新遍历到的节点加到最前面。


(三)链表融合

 void mergeList(ListNode*& l1, ListNode*& l2){
        ListNode* l1_next = nullptr;
        ListNode* l2_next = nullptr;
        while(l1 != nullptr && l2 != nullptr){
            l1_next = l1 -> next;
            l2_next = l2 -> next;

            l1 -> next = l2;
            l2 -> next = l1_next;
			/* 更新l1,l2 为下一次迭代做准备*/
            l1 = l1_next;
            l2 = l2_next;
        }
    }

跳出循环条件其实不必如此严苛,但为了程序更鲁棒,也是为了更易读,还是采用这种写法。

总结

看完别忘了点赞哦(人 •͈ᴗ•͈)۶♡♡
欢迎评论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值