C++相交鏈表和反轉(zhuǎn)鏈表詳解
給你兩個(gè)單鏈表的頭節(jié)點(diǎn) headA 和 headB ,請(qǐng)你找出并返回兩個(gè)單鏈表相交的起始節(jié)點(diǎn)。如果兩個(gè)鏈表沒(méi)有交點(diǎn),返回 null 。

思路
簡(jiǎn)單來(lái)說(shuō),就是求兩個(gè)鏈表交點(diǎn)節(jié)點(diǎn)的 指針。 這里同學(xué)們要注意,交點(diǎn)不是數(shù)值相等,而是指針相等。
為了方便舉例,假設(shè)節(jié)點(diǎn)元素?cái)?shù)值相等,則節(jié)點(diǎn)指針相等。
看如下兩個(gè)鏈表,目前curA指向鏈表A的頭結(jié)點(diǎn),curB指向鏈表B的頭結(jié)點(diǎn):

我們求出兩個(gè)鏈表的長(zhǎng)度,并求出兩個(gè)鏈表長(zhǎng)度的差值,然后讓curA移動(dòng)到,和curB 末尾對(duì)齊的位置,如圖:

此時(shí)我們就可以比較curA和curB是否相同,如果不相同,同時(shí)向后移動(dòng)curA和curB,如果遇到curA == curB,則找到焦點(diǎn)。
否則循環(huán)退出返回空指針。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA=headA;
ListNode* curB=headB;
int lenA=0;
int lenB=0;
while(curA!=nullptr){ // 求鏈表A的長(zhǎng)度
lenA++;
curA=curA->next;
}
while(curB!=nullptr){ // 求鏈表B的長(zhǎng)度
lenB++;
curB=curB->next;
}
//現(xiàn)在的curA,curB已經(jīng)指向最后一個(gè)節(jié)點(diǎn)了,需要重新指向頭結(jié)點(diǎn)
curA=headA;
curB=headB;
if(lenA<lenB){ //假設(shè)鏈表A的長(zhǎng)度大于鏈表B,否則交換
swap(lenA,lenB);
swap(curA,curB);
}
//gap是兩個(gè)鏈表長(zhǎng)度的差值
int gap=lenA-lenB; // gap=lenA-lenB 錯(cuò)誤,要有返回類(lèi)型
while(gap){ // 讓curA和curB在同一起點(diǎn)上(末尾位置對(duì)齊)
gap--;
curA=curA->next;
}
while(lenB){ // 遍歷curA 和 curB,遇到相同則直接返回
if(curA==curB)
return curA; // return curA(val) 返回節(jié)點(diǎn)中的值,這個(gè)寫(xiě)法是錯(cuò)誤的 直接return curA
curA=curA->next;
curB=curB->next;
lenB--;
}
return nullptr; //沒(méi)有交點(diǎn)則返回空
}
};
給你單鏈表的頭節(jié)點(diǎn) head ,請(qǐng)你反轉(zhuǎn)鏈表,并返回反轉(zhuǎn)后的鏈表。
示例 1:
輸入:head = [1,2,3,4,5]
輸出:[5,4,3,2,1]
示例 2:
輸入:head = [1,2]
輸出:[2,1]
示例 3:
輸入:head = []
輸出:[]
雙指針?biāo)悸?/h3>
首先判斷鏈表是否為空,為空則返回nullptr。
接下來(lái)定義一個(gè)cur指針,指向頭結(jié)點(diǎn),再定義一個(gè)pre指針,初始化為null。
然后就要開(kāi)始反轉(zhuǎn)了,首先要把 cur->next 節(jié)點(diǎn)用tmp指針保存一下,也就是保存一下這個(gè)節(jié)點(diǎn)。
為什么要保存一下這個(gè)節(jié)點(diǎn)呢,因?yàn)榻酉聛?lái)要改變 cur->next 的指向了,將cur->next 指向pre ,此時(shí)已經(jīng)反轉(zhuǎn)了第一個(gè)節(jié)點(diǎn)了。
接下來(lái),就是循環(huán)走如下代碼邏輯了,繼續(xù)移動(dòng)pre和cur指針。
最后,cur 指針已經(jīng)指向了null,循環(huán)結(jié)束,鏈表也反轉(zhuǎn)完畢了。 此時(shí)我們r(jià)eturn pre指針就可以了,pre指針就指向了新的頭結(jié)點(diǎ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* reverseList(ListNode* head) {
if(head==nullptr) //對(duì)空鏈表的判斷
return nullptr;
ListNode* per=nullptr;
ListNode* cur=head;
ListNode* temp; //建立一個(gè)指針
while(cur){ //沒(méi)必要寫(xiě) while(cur!=nullptr),寫(xiě)了這個(gè)還要判斷cur,會(huì)浪費(fèi)時(shí)間,直接cur就可以
temp=cur->next; //保存cur的下一個(gè)節(jié)點(diǎn)
cur->next=per; //cur的下一個(gè)節(jié)點(diǎn)指向per,實(shí)現(xiàn)反轉(zhuǎn)
per=cur; //cur=per;錯(cuò)誤,是把cur的節(jié)點(diǎn)賦值給per
cur=temp; //temp=cur;錯(cuò)誤,是把temp(原來(lái)的cur->next)的節(jié)點(diǎn)賦值給cur
}
return per;
}
};
遞歸
/**
* 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* per,ListNode* cur){ //返回的是一個(gè)鏈表,其返回值是指針
if(cur==nullptr) //遞歸的終止條件
return per;
ListNode* temp=cur->next;
cur->next=per;
return reverse(cur,temp); // 調(diào)用要寫(xiě)return
}
ListNode* reverseList(ListNode* head) {
if(head==nullptr) //鏈表判空
return nullptr;
return reverse(NULL,head); // 調(diào)用要寫(xiě)return
}
};
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C/C++計(jì)算程序執(zhí)行時(shí)間的幾種方法實(shí)現(xiàn)
本文主要介紹了C/C++計(jì)算程序執(zhí)行時(shí)間的幾種方法實(shí)現(xiàn),包括使用clock()函數(shù)、使用庫(kù)和使用time.h頭文件中的time()函數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
C語(yǔ)言手寫(xiě)多級(jí)時(shí)間輪定時(shí)器
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)手寫(xiě)多級(jí)時(shí)間輪定時(shí)器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09
基于MFC實(shí)現(xiàn)自定義復(fù)選框效果
復(fù)選框是一種可同時(shí)選中多項(xiàng)的基礎(chǔ)控件,主要是有兩種明顯的狀態(tài):選中與非選中。本文將通過(guò)MFC框架實(shí)現(xiàn)自定義復(fù)選框效果,感興趣的可以了解一下2022-02-02
C/C++中for語(yǔ)句循環(huán)用法以及練習(xí)舉例
for語(yǔ)句是一種循環(huán)語(yǔ)句,它是對(duì)while語(yǔ)句的推廣,下面這篇文章主要給大家介紹了關(guān)于C/C++中for語(yǔ)句循環(huán)用法以及練習(xí)舉例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
C語(yǔ)言解決堆棧括號(hào)匹配問(wèn)題示例詳解
這篇文章主要為大家介紹了C語(yǔ)言堆棧括號(hào)匹配問(wèn)題示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11

