C語(yǔ)言解字符串逆序和單向鏈表逆序問(wèn)題的代碼示例
字符串逆序
上次面試碰到一個(gè)單向鏈表逆序的題目,幸好對(duì)字符串逆序比較熟悉,類比做出來(lái)了。字符串逆序比較簡(jiǎn)單,直接上代碼:
void stringReverse(char* p1,char* p2)
{
if(p1==p2)return;
//swap the value of p1 ,p2
*p1=(*p1)+(*p2);
*p2=(*p1)-(*p2);
*p1=(*p1)-(*p2);
if(p1==p2-1)return;
else stringReverse(++p1,--p2);
}
調(diào)用示例:
stringReverse(str,str+strlen(str)-1);
單向鏈表逆序
先上三幅圖:原始狀態(tài)是圖一,全部逆序之后是圖三的樣子,圖二是逆序一步之后的樣子。按照?qǐng)D二的步驟依次往后,每次移動(dòng)一步,把p1->next 反向,直到全部逆序。詳細(xì)原理請(qǐng)看代碼。
圖一:

圖二:

圖三:

typedef struct Node Node;
struct Node{
int data;
Node* next;
};
Node* reverseLinkList(Node* head){
if (head==NULL||head->next==NULL) {
return head;
}
Node* p1 = head;
Node* p2 = p1->next;
Node* p3 = p2->next;
p1->next = NULL;//p1要變成尾指針,所以指向NULL
while (p3!=NULL) {
p2->next = p1;//p2->next 反向
p1=p2;//p1指針向后移動(dòng)一步
p2=p3;//p2指針向后移動(dòng)一步
p3=p3->next;//p3指針向后移動(dòng)一步
}
p2->next=p1;//p3指向了NULL,p2反向
head=p2;//頭指針指向之前的尾指針
return head;
}
至此結(jié)束了。
相關(guān)文章
vscode和cmake編譯多個(gè)C++文件的實(shí)現(xiàn)方法
這篇文章主要介紹了vscode和cmake編譯多個(gè)C++文件的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
你知道C語(yǔ)言函數(shù)調(diào)用常用的2種方式嗎
本篇博客會(huì)講解C語(yǔ)言函數(shù)調(diào)用的2種方式,分別是:傳值調(diào)用和傳址調(diào)用。這2種函數(shù)調(diào)用方式有什么區(qū)別呢?為什么會(huì)有不同的效果呢?分別有哪些用途呢?下面就來(lái)一一展開(kāi)2023-04-04
C++實(shí)現(xiàn)LeetCode(205.同構(gòu)字符串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(205.同構(gòu)字符串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++實(shí)現(xiàn) vector 的四則運(yùn)算
本文給大家介紹的是在C++中實(shí)現(xiàn)高效的vector四則運(yùn)算的方法的相關(guān)資料,需要的朋友可以參考下2016-07-07
C語(yǔ)言不使用strcpy函數(shù)如何實(shí)現(xiàn)字符串復(fù)制功能
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言不使用strcpy函數(shù)如何實(shí)現(xiàn)字符串復(fù)制功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

