前言
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;
}
}
跳出循环条件其实不必如此严苛,但为了程序更鲁棒,也是为了更易读,还是采用这种写法。
总结
看完别忘了点赞哦(人 •͈ᴗ•͈)۶♡♡
欢迎评论!