一篇玩转链表

it2023-01-12  52

文章目录

前言一、直观做法(一)线性表存储(二)链表中点+后半部分链表倒置+链表融合 二.代码(一)快慢指针法得链表中点(二)链表倒置(三)链表融合 总结

前言

       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; } }

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

总结

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

最新回复(0)