演算法學習09 判斷鍊錶是否為回文結構C 實現

2021-10-19 17:23:44 字數 3050 閱讀 6689

給定乙個單鏈表的頭結點head,請判斷該鍊錶是否為回文結構

例子1->2->1,返回ture

1->2->2->1返回ture

15->6->15返回ture

1->2->3返回false

分析將鍊錶中的元素按順序存入堆疊,那麼棧的彈出順序和鍊錶的順序剛好相反。對比棧頂元素和鍊錶當前元素,如果不同,返回false,如果相同,彈出棧並將鍊錶指向下乙個元素,不斷遍歷至空,若全部相同,返回true

#include

#include

#include

struct listnode };

// need n extra space

bool

ispalindrome1

(listnode* head)

while

(head!=

nullptr

)else

}return

true;}

intmain()

else

return0;

}

分析

使用快慢指標,快指標一次走兩步,慢指標一次走一步。當快指標走完的時候,慢指標走到中間位置,將慢指標的後一半推入堆疊,出棧時元素如果和鍊錶前半部分相同,則是回文結構。與方法一相比,當前方法只占用一半的堆疊空間,所以額外空間複雜度為)(n/2)。乙個特殊的難點在於如何使慢指標在總元素個數無論是奇數還是偶數時,都恰好指在中間元素的後乙個位置上。

根據快指標走完,慢指標所在的位置具體定製快慢指標

如果是奇數個,快指標走完,慢指標指在最中間的位置上;

如果是偶數個,快指標走完,慢指標指在中點的前乙個或後乙個元素上。

// need n/2 extra space

bool

ispalindrome2

(listnode* head)

std::stack<

int> my_node_value;

listnode* slownode = head -

> next;

listnode* fastnode = head;

while

(fastnode -

> next !=

nullptr

&& fastnode -

> next -

> next !=

nullptr

)while

(slownode !=

nullptr

)while

(!my_node_value.

empty()

)else

}return

true

;}

完整**

#include

#include

#include

struct listnode };

// need n/2 extra space

bool

ispalindrome2

(listnode* head)

std::stack<

int> my_node_value;

listnode* slownode = head -

> next;

listnode* fastnode = head;

while

(fastnode -

> next !=

nullptr

&& fastnode -

> next -

> next !=

nullptr

)while

(slownode !=

nullptr

)while

(!my_node_value.

empty()

)else

}return

true;}

intmain()

else

return0;

}

分析

總體分為四步

找到中間位置,當鍊表元素為奇數個時,方法二的慢指標停在之間靠右乙個位置,方法三的慢指標位於最中間。(這樣設計後從慢指標的下乙個位置開始就是反轉部分)

逆序後半部分,採用反轉鍊錶的方法

進行比較

重排恢復鍊錶,依舊是乙個逆序的過程

**

//使用快慢指標但不用輔助空間判斷是否是回文鍊錶

#include

using

namespace std;

typedef

struct listnode

*list;

bool

ispalindromelist

(list head)

p2 = p2-

>next;

}//逆序

list cur = p1;

list pre =

null

;while

(cur!=

null

)//比較

bool res =

true

; cur = pre;

//pre是保留的最後乙個數

while

(cur !=

null

) cur = cur-

>next;

head = head-

>next;

}//重排

cur = pre;

pre =

null

;while

(cur!=

null

&& cur!= p1_pre)

return res;

}list insert

(list head,

int num)

//將新節點加入鍊錶

r->next = p;

return head;

}list makeempty()

intmain()

Python判斷是否為回文鍊錶

突然發現python語法的優美和簡潔,清爽,不拖泥帶水。龜叔 guido van rossum 就說 除了不能生孩子,python真的能幹很多事。definition for singly linked list.如果位元組面試 時間複雜度o n 空間複雜度o 1 class listnode de...

判斷鍊錶是否為回文結構

給定乙個鍊錶的頭節點 head,請判斷該鍊錶是否為回文 正反結構相同 結構。如果鍊錶長度為 n,時間複雜度達到 o n 額外空間複雜度達到 o 1 參考 程式設計師 面試指南 放入棧,時間複雜度o n 空間複雜度o n bool ispalindrome1 node head while null ...

判斷鍊錶是否回文?

given a singly linked list,determine if it is a palindrome.思路 兩個指標,乙個正常遞推,另乙個遞推速度為第乙個的兩倍 node.next.next 到末,分兩種情況 1.奇數個元素,最後快指標指向最後乙個元素 p2.next null 2....