1.具有煉表頭的單鏈表
假設需要逆序的單鏈表為:
則逆序以後的鍊錶為:
過程:(1)取p1指向header->next (p1=stu->next);
p2保留p1->next(p2=p1->next);
將p1->next置為null,因為單鏈表逆序以後,當前的p1節點為尾節點 p1->next=null;
(2)取p3保留p2->next (p3=p2->next);
將p2插入p1之前(p2->next = p1);
p1指向p2指向的節點(p1=p2);
p2指向p3指向的節點(p2=p3);
迴圈一次修改以後的單鏈表如下:
(3)重複步驟(2)
迴圈一次修改以後的單鏈表如下:
(4)將header->next指向p1,完成整個單鏈表的逆序
typedef struct studentstudent;
student *reverse(student *stu)
stu->next=p1;
return stu;
}
2.鍊錶回文
判斷乙個單向鍊錶是否是回文鍊錶,要求o(n)的時間複雜度和o(1)的空間複雜度。演算法有以下幾種:
遍歷整個鍊錶,將鍊錶每個節點的值記錄在陣列中,再判斷陣列是不是乙個回文陣列,時間複雜度為o(n),但空間複雜度也為o(n),不滿足空間複雜度要求。
利用棧先進後出的性質,將鍊錶前半段壓入棧中,再逐個彈出與鍊錶後半段比較。時間複雜度o(n),但仍然需要n/2的棧空間,空間複雜度為o(n)。
反轉鍊錶法,將鍊錶後半段原地翻轉,再將前半段、後半段依次比較,判斷是否相等,時間複雜度o(n),空間複雜度為o(1)滿足題目要求。
使用快慢指標加棧實現判斷的**如下:
publicview codeboolean
chkpalindrome(listnode a)
else
}if (flag == true
) stack.pop();
while (!stack.isempty() && slow != null
)
if (slow == null &&stack.isempty())
return
true
;
else
return
false
; }
使用快慢指標和原地翻轉的**如下:
publicview codeboolean
chkpalindrome(listnode a)
listnode p =slow.next;
listnode p1 =p.next;
while (p != null
) }
while (a !=slow)
if(a.next==slow)
a =a.next;
slow =slow.next;
}return
true
; }
判斷鍊錶是否回文?
given a singly linked list,determine if it is a palindrome.思路 兩個指標,乙個正常遞推,另乙個遞推速度為第乙個的兩倍 node.next.next 到末,分兩種情況 1.奇數個元素,最後快指標指向最後乙個元素 p2.next null 2....
C C 之判斷鍊錶是否是回文鍊錶
判斷鍊錶是否是回文鍊錶主要通過判斷對應位置的元素值是否是相等的第一種解法 將原有鍊錶反轉獲取新的鍊錶,與原有的鍊錶比較,判斷對應元素的值是否相等 include using namespace std struct node typedef struct node plist typedef str...
鍊錶 判斷乙個鍊錶是否為回文鍊錶
思路1 找到中間節點然後把後面的翻轉,需要斷開鍊錶 然後比較和頭節點開始的前段,最後要是後半段的游標可以走到最後說明是回文否則不是 思路2 整體翻轉比較 思路3 借助乙個棧存放前半段的元素,然後和後半段的比較 public boolean ispalindrome listnode head lis...