最近在對學習的鏈表、隊列、棧等進行學習與總結,將遇到的題目總結出來,供大家交流
知識點:鏈表、棧
題目:
對於一個鏈表,,判斷其是否爲迴文結構。
給定一個鏈表的頭指針A,請返回一個bool值,代表其是否爲迴文結構。保證鏈表長度小於等於900。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
}
};
思路:
1.利用快慢指針,快指針每次進兩格,慢指針每次進一格,當快指針指到NULL末尾時,慢指針指到中間位置
2.逆序指針
3.從頭尾指針進行比較
代碼:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
if(A->next == NULL)//只有一個元素爲迴文
return true;
else if(A == NULL)//空元素不是迴文
return false;
//快慢指針找出中間節點
ListNode *fast = A;//均指向頭結點
ListNode *slow = A;
ListNode *temp, *cur;
while(fast->next != NULL && fast != NULL) //保證fast的下下個節點不爲空
{
// temp = slow; // temp 是保存slow的前一個節點,即第一部分的最後一個節點
fast = fast->next->next;
slow = slow->next;// 爲奇數,slow爲中間節點,偶數時,slow爲第二部分第一個節點
}//跳出程序的時候slow爲中間節點
cur = slow->next;
slow ->next = NULL;
//反轉鏈表
while(cur!=NULL)
{
temp = cur->next; //mid,cur,temp三個指針操作反轉鏈表。
cur->next = slow;
slow = cur;
cur = temp;
}
while(A != NULL && slow != NULL)
{
if(A->val == slow->val)
{
A = A->next;
slow = slow->next;
}
else
return false;
}
return true;
}
思路2:複製鏈表A,將鏈表中的元素通過push壓入棧,再利用出棧,比較stack.top()(尾部元素) 和鏈表A(頭部元素)是否相等
代碼:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
if(A==NULL)
return true;
ListNode *B ;
B = A;
stack<int> st;
while(B != NULL)
{
st.push(B->val);
B = B->next;
}
while(A != NULL)
{
if(st.top() == A->val)
{
st.pop();
A = A->next;
}
else
return false;
}
return true;
}
};