leetcode :
leetcode上有下面這樣乙個題目,比較有意思,拿來實現,權當練習基本功了:
total accepted: 8598
total submissions: 44508
my submissions
given a singly linked list l: l
0→l1→…→l
n-1→l
n,reorder it to: l
0→ln
→l1→l
n-1→l
2→ln-2→…
you must do this in-place without altering the nodes' values.
for example,
given, reorder it to
.
題目要求我們演算法是in-place的,因此我們不能夠通過交換value的值來實現,只能對鍊錶進行重新鏈結。
對於本題,我的思路是這樣的:經過觀察發現,reorder後的鍊錶是原來鍊錶前半部分與後半部分的逆序交叉鏈結得到的。
因此:1. 首先找到原來鍊錶的中間節點mid,將原鍊錶分成兩部分;
2. 前面部分存入乙個佇列queue中;
3. 後半部分則存入乙個棧stack中(這樣取出來的時候自動逆序);
4. 然後再將佇列這棧中的元素交替取出,並鏈結取來,從而得到reorder後的結果。
思想很簡單,下面直接上已經ac過的**,如果你還有更好的思路請告訴我,希望學習進步:
#include #include #include #include #include #include using namespace std;
struct listnode
};class solution
return p1 ;
} void reorderlist(listnode *head)
//後半部分存入棧
while (midptr != null)
//將兩部分合併
listnode *ptr = q.front() ;
q.pop() ;
while (!q.empty())
while (!s.empty()) //一定有s.size() >= q.size()
ptr->next = null ;
}};ifstream in("data.txt") ;
#define cin in
int main(int argc, char **argv)
else
}solution s ;
s.reorderlist(head) ;
listnode *ptr = head ;
while (ptr)
cout << endl;
return 0 ;
}
給定基準重新排列鍊錶資料
leetcode練習題,比基準值小的放其前面,否則放後面,且原鍊錶的結點位置關係不變,如 8 2 5 1 6 3 4 9 10,給定基準值7 則結果為 2 5 1 6 3 4 8 9 10 建立兩個鍊錶,乙個放比基準值小的,乙個放大的,之後再將兩鍊錶鏈結起來即可 給定基準重新排列鍊錶資料 struc...
重新排列引數
重新排列引數 重新排列引數操作可以使你重新排列方法 索引器中的引數。你將方法的引數重新排列後,所有使用該方法的地方都會相應調整。以下面 為例 class person class program 將游標放置在 print 方法上使用 重新排列引數 命令,將會彈出下面對話方塊 29.16 圖29.16...
Leetcode 143 重新排列鍊錶
這裡涉及到三個鍊錶的基本操作,這是一道很經典的鍊錶操作題目 首先是尋找鍊錶的中點,設定兩個指標,一快 一慢 其次是反轉鍊錶,這是非常常見的乙個鍊錶操作,很容易出錯 最後是兩個鍊錶的交叉連線 public void reorderlist listnode head private listnode ...