鍊錶的回文結構,即 1 --> 2 --> 3 --> 2 --> 1 這樣的形式,鍊錶正著和反過來是一樣的。
思路:1、將原鍊錶進行拷貝;
2、對拷貝的鍊錶進行逆置;
3、然後比較逆置之後的鍊錶和原鍊錶是否相同。
public
boolean
chkpalindrome
(listnode a)
// 2 先拷貝乙份原鍊錶,不破壞原來的鍊錶
listnode newhead =
newlistnode(0
);listnode newtail = newhead;
for(listnode node = a;node != null;node = node.next)
// 3 用三指標法,即 prev、cur、next 來逆置鍊錶
listnode prev = null;
listnode cur = newhead.next;
while
(cur != null)
listnode curreversea = prev;
// 4 比較逆置之後的鍊錶和原鍊錶是否相同
listnode cura = a;
while
(curreversea != null && cura != null)
else
}return
true
;}
思路:
1、不用新建立鍊錶,直接在原煉表上進行操作;
2、求得鍊錶的長度,然後讀取到一半的元素;
3、對一半的元素進行逆置;
4、然後將逆置後的半個鍊錶與剩下的未逆置的一半鍊錶進行比較。
private
static
intgetlength
(listnode head)
return length;
}public
static
boolean
chkpalindrome
(listnode a)
// 2、讀取到前半個鍊錶
int len =
getlength
(a);
int steps = len /2;
listnode b = a;
for(
int i =
0; i < steps; i++
)// 3、將這前半個鍊錶進行逆置
listnode prev = null;
listnode cur = b;
while
(cur != null)
b = prev;
// 4、比較逆置了的前半個鍊錶和未逆置的後半個鍊錶
listnode cur1 = a;
listnode cur2 = b;
while
(cur1 != null && cur2 != null)
cur1 = cur1.next;
cur2 = cur2.next;
}return
true
;}
注意:
鍊錶結點為奇數個和偶數個的時候,鍊錶的樣子是不一樣的,但是**是一致的。
偶數個時,因為 cur1 != null && cur2 != null 這個條件,只要乙個為null,迴圈就會結束了。
常見單鏈表題型(八)鍊錶的回文結構
對於乙個鍊錶,請設計乙個時間複雜度為o n 額外空間複雜度為o 1 的演算法,判斷其是否為回文結構。給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。示例 輸入 1 2 2 1 輸出 是 struct listnode 方法一 將鍊錶儲存在陣列裡,再首尾...
資料結構單鏈表
初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...
資料結構 單鏈表
今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...