每日一題 LintCode 鍊錶翻轉題解

2021-09-02 01:34:44 字數 1191 閱讀 5680

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...