面試演算法題 1 鍊錶反轉

2021-08-21 06:50:18 字數 1662 閱讀 1136

分享一道面試碰到的演算法題。

鍊錶反轉,不借助任何掐資料結構或容器。

意思就是把鍊錶尾當成煉表頭,並且每個節點的指標反向。先看下圖:

黑色部分是原來鍊錶;

紅色部分是翻轉後的鍊錶。

思路分析:

1、拿到head煉表頭,然後遞迴處理。

2、當處理到head節點是,需要把head的next指標置空。

3、如果是最後乙個節點,需要把節點引用賦給head。

4、如果是中間的某節點,需要把其引用賦給他下乙個節點的next指標。

思路理清楚了,感覺好像不難。我們開始擼**。

public void reserve(node node)

//2if(node == head)

//3if(node.next == null)

//4//獲取下乙個節點

node nextnode = node.next;

//翻轉,下乙個節點的next指標指向當前node節點

nextnode.next = node;

reserve(nextnode);

}

分析上面2和3處的**,

第一次呼叫時,傳入head節點,然後就立即執行了head.next = null;

接著就會進入3處的判斷。然後程式結束了?

這兒肯定有問題,head.next不應該先處理,可以放到判斷3處。修改**如下

public void reserve(node node)

//2.表示是末尾節點

if(node.next == null)

//4//獲取下乙個節點

node nextnode = node.next;

//翻轉,下乙個節點的next指標指向當前node節點

nextnode.next = node;

reserve(nextnode);

}

**擼完了,是不是上面這樣的?

哈哈,有問題。為啥?你代入head節點看看。

會不會出現下面這張圖的效果?

//2.表示是末尾節點

if(nextnode == null)

//4//獲取下下乙個節點

node nextnextnode = nextnode.next;

//翻轉,下乙個節點的next指標指向當前node節點

nextnode.next = curnode;

reserve(nextnode, nextnextnode);

}這回是真的擼完了,

node nextnextnode = nextnode.next;

上面這行**很重要。

你可以執行看看效果。

面試演算法 鍊錶反轉

今天來將一下面試中經常問到的乙個問題 鍊錶反轉。題目1 給乙個單向鍊錶,請編寫乙個函式,把鍊錶反轉,並把反轉的鍊錶返回。假設給的節點為 class listnode 單向鍊錶反轉函式如下 public listnode reverse1 listnode head return prev 題目2 給...

面試演算法篇 鍊錶

1.如何在一次遞迴後找到單鏈表的中間元素 思路 使用兩個指標,乙個一次走一步,乙個一次走兩步,一次走兩步的走完時,另乙個剛好走到中間.public listnode findmid listnode head slow slow.next quick quick.next.next return s...

面試演算法題

前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...