判斷單鏈表是否為回文,快慢指正加棧的方式解決
首先輸入這個鍊錶的長度,然後用尾插的方式,初始化鍊錶。接下來用快慢指標。
快指標每次走兩步,慢指標每次走一步,當快指標的next為null時(也就是快指標走到了最後乙個),那麼慢指標剛好就在中間,因為鍊錶沒有環,所以將鍊錶的情況分為奇數和偶數兩種情況。當長度為奇數時,快指標第一步就走兩步,慢指標第一步就走一步,當長度為偶數時,快指標第一步走一步,慢指標第一步不動。兩種情況也就第一步不同,其餘步數都相同。直到快指標走到末尾為止。
#include
#include
typedef
struct _node
node;
node* p;
//快指標
node* q;
//慢指標
node* r;
//記錄鍊錶的末尾
int a[
101]
;//用棧的形式,存放鍊錶的後半段
int m,m3;
//m表示輸入的數是奇數還是偶數,m3表示陣列a中存放的數字的個數
node*
initialization
(int num, node* head)
//鍊錶初始化,再加上新增鍊錶長度
s->data = num;
s->next =
null
; r->next = s;
r = s;
return head;
}node*
pjring
(node* p, node* head)
//快if
(p->next->next ==
null
) p = p->next->next;
return p;
}node*
**ring
(node* q, node* head)
//慢else
}void
link
(node* q)
//將鍊錶的後半段壓入棧a中}}
intcompare
(node* p,
int m3)
//將鍊錶的前半段和棧a中的進行比較
p = p->next;
}return m3;
}int
main()
p = head;
q = head;
while(1
)}p = head;
m3 =
compare
(p,m3);if
(m3 ==-1
)else
return0;
}
判斷單鏈表是否有環(快慢指標)
方法一 使用p q兩個指標,p總是向前走,但q每次都從頭開始走,對於每個節點,看p走的步數是否和q一樣。如圖,當p從6走到3時,用了6步,此時若q從head出發,則只需兩步就到3,因而步數不等,出現矛盾,存在環。方法二 使用p q兩個指標,p每次向前走一步,q每次向前走兩步,若在某個時候p q,則存...
判斷是否為回文字串 棧 佇列 鍊錶 快慢指標
方法一 1.將字串按照使用者輸入的順序分別入棧和佇列 2.分別從佇列和棧中取出首個字元 3.比較取出的字元,若相等,繼續分別從佇列和棧中取首個字元 否則跳出迴圈,並設定標誌 flag 0 4.若佇列和棧中的字元取完,則結束,設定標誌flag 1 5.flag 1,表示字元從前往後和從後往前的序列完全...
快慢指標之判斷回 單鏈表
因為回 串是對稱的,所以正著讀和倒著讀應該是 樣的,這 特點是解決回 串問題的關鍵.這道題的關鍵在於,單鏈表 法倒著遍歷,法使 雙指標技巧。那麼最簡單的辦法就是,把原始鍊錶反轉存 條新的鍊錶,然後 較這兩條鍊錶是否相同。1 先通過 雙指標技巧 中的快慢指標來找到鍊錶的中點 slow fast hea...