lintcode-翻轉鍊錶
翻轉乙個鍊錶
給出乙個鍊錶1->2->3->null,這個翻轉後的鍊錶為3->2->1->null
在原地一次翻轉完成
翻轉鍊錶是乙個很基礎的題,同時也是面試中開場常問的題,那麼他的難點在哪呢?
我們都知道單鏈表的資料結構如下:
public
class
listnode
翻轉的實現是怎樣的呢?將當前節點的next指標指向前乙個節點.對下乙個節點進行同樣的操作.
這裡面有兩個變數:
鍊錶節點無法獲知前置節點.
當你將next節點指向前置後,next指標被改變,無法繼續向下遍歷.
所以我們只需要在實現中維護前置節點及後繼節點的值即可.
因此不多bb,上**加注釋!
首先是用遞迴方式實現:
/**
* 遞迴實現
*//**
* 遞迴實現,將前置節點作為引數傳遞,初始呼叫pre=null
*/private
static listnode reverse2
(listnode head, listnode pre)
//儲存後繼節點
listnode next = head.next;
//將當前節點的next指標指向前置節點(翻轉操作)
head.next = pre;
//翻轉下乙個節點及其前置節點
return
reverse2
(next, head)
;}
然後是非遞迴實現:
/**
* 非遞迴實現,直接傳入當前節點即可
*/public
static listnode reverse
(listnode head)
//為空時返回前置節點
return prenode;
}
執行結果如下(沒有錯誤,我連續翻轉了兩次):
完。changelog 2018-11-27 完成
更多學習筆記見個人部落格------>呼延十
每日一題 翻硬幣
翻硬幣 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用o表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那...
每日一題 反轉鍊錶
這道是牛客的題,給了鍊錶然後返回鍊錶的新表頭。拿到這道題首先肯定想到的是暴力求解,從表頭開始遍歷到尾,用尾元素作為新錶的表頭,然後遍歷尾元素的上乙個元素,鏈到新錶的最後然後不斷重複直到鍊錶的表頭鏈到新錶的尾巴 這樣有乙個很大的問題就是複雜度太高了,時間複雜度是o n n 這個時候我想到了肯定有簡單的...
LeetCode每日一題 回文鍊錶
題目 請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 思路 判斷是否是回文,可以將鍊錶儲存在乙個陣列中,然後用兩個指標乙個指向頭,乙個指向尾,同時向中間掃瞄。演算法 複製鍊錶值到陣列列表中。使用雙指標法判斷是否為回文。cl...