判斷連結串列是否為迴文結構,空間負責度為O(1),時間複雜度為O(n)
原題描述
判斷一個連結串列是否為迴文結構,要求額外空間複雜度為O(1),時間複雜度為O(n)
解題思路
一、雙向連結串列
如果連結串列是雙向連結串列,那簡直不要太完美。直接從連結串列兩端向中間遍歷即可判定
可惜,這個題目肯定不會說的是這種情況,不過還是寫上吧 _
二、單向連結串列
這才是真正的考點所在喲。
1、申請一個指標,從表頭遍歷至連結串列中間位置
2、將原連結串列後半部分進行指標指向倒置,比如a->b->c變換為c->b->a(倒置思路見後文)
3、然後類似於雙向連結串列一樣進行遍歷判定是否為迴文結構即可
連結串列指標指向倒置思路(以a->b->c->d->e為例):
1、申請指標 x,y,z
2、從a節點開始遍歷,將其a,b,c分別賦值給x,y,z(x=a, y=b, z=c)
3、將b指向a,此時即可得到兩個連結串列結構(b->a, c->d->e)
4、重複操作,將c指向b,得到c->b->a, d->e兩個連結串列,直到所有指標都進行了指向倒置
大功告成
複雜度分析
空間複雜度:
需要額外的四個指標(x,y,z 和指向原連結串列前半部分的頭結點指標),則空間消耗為O(1)
時間複雜度:
倒置指標指向需要遍歷一遍連結串列,判斷是否迴文結構需要遍歷一次兩個長度分別n/2或n/2+1的連結串列,即時間複雜度為O(n)+O(n/2)+O(n/2+1) 即為O(2n),即為O(n)
胡扯
看到這個題目,最開始我是崩潰的,經歷了一天四堂筆試的我,難受(技術渣,沒辦法)
注各位大佬早日找到工作,也祝我能夠運氣好點,沾沾大佬的喜氣 _
注:
若有錯誤,請指正。歡迎大佬提供更優秀的解法
相關文章
- Leetcode 234. 迴文連結串列 快慢指標+連結串列逆序實現O(n)時間複雜度且O(1)空間複雜度LeetCode指標時間複雜度
- 時間複雜度O(n)和空間複雜度時間複雜度
- 時間複雜度O(1)、O(n)、O(n²)、O(nlogn)的含義時間複雜度
- 時間複雜度為 O (n^2) 的排序演算法時間複雜度排序演算法
- 時間複雜度為 O(n^2) 的排序演算法時間複雜度排序演算法
- Java實現:排序演算法--時間複雜度為O(n² )Java排序演算法時間複雜度
- 請判斷一個連結串列是否為迴文連結串列。
- 時間複雜度為 O(nlogn) 的排序演算法時間複雜度排序演算法
- 時間複雜度為O(nlogn)的排序演算法時間複雜度排序演算法
- 演算法與資料結構--空間複雜度O(1)遍歷樹演算法資料結構複雜度
- 判斷是否為環形連結串列
- 時間複雜度跟空間複雜度時間複雜度
- 時間複雜度與空間複雜度時間複雜度
- 時間複雜度和空間複雜度時間複雜度
- 隨機列印0-100的全部數字並且不可重複,時間複雜度為O(n)隨機時間複雜度
- O1空間複雜度實現陣列迴圈右移_LeetCode189複雜度陣列LeetCode
- 資料結構:時間複雜度資料結構時間複雜度
- 判斷迴文連結串列
- 13. O(1)時間刪除連結串列節點
- 自學 資料結構四月二十一日_時間複雜度&空間複雜度資料結構時間複雜度
- 資料結構-邏輯關係&物理關係、時間複雜度、空間複雜度、順序表資料結構時間複雜度
- 時間與空間複雜度分析複雜度
- 二叉樹的 Morris 中序遍歷——O(1)空間複雜度二叉樹複雜度
- 快速排序平均時間複雜度O(nlogn)的推導排序時間複雜度
- 牛客網高頻演算法題系列-BM13-判斷一個連結串列是否為迴文結構演算法
- JavaScript 資料結構與演算法之美 - 時間和空間複雜度JavaScript資料結構演算法複雜度
- JZ-069-在 O(1) 時間內刪除連結串列節點
- 122 演算法的時間複雜度和空間複雜度詳解演算法時間複雜度
- 資料結構 之 演算法時間複雜度資料結構演算法時間複雜度
- 資料結構與演算法——時間複雜度資料結構演算法時間複雜度
- 資料結構與演算法(一):帶你瞭解時間複雜度和空間複雜度到底是什麼?資料結構演算法時間複雜度
- PHP 演算法基礎----時間複雜度和空間複雜度(轉載)PHP演算法時間複雜度
- 那些年忽略的知識:時間複雜度和空間複雜度詳解時間複雜度
- 判斷字串是否為空字串
- 冰與火之歌:「時間」與「空間」複雜度複雜度
- 一文講透演算法中的時間複雜度和空間複雜度計算方式演算法時間複雜度
- 額外空間複雜度O(1) 的二叉樹遍歷 → Morris Traversal,你造嗎?複雜度二叉樹
- 時間複雜度怎麼算?如何計算時間複雜度?時間複雜度