Java單鏈表的反轉

2021-08-06 03:43:42 字數 2630 閱讀 6361

前段時間有同事面試,給面試的人都提乙個演算法問題那就是單鏈表的反轉,好多小夥伴都不會,或者表示一聽演算法就懵逼了,自己寫了乙個。就是5-4-6-8-9-1-2-7,反轉輸出7-2-1-9-8-6-4-5,我自己寫的反轉有兩種方式。一種是遞迴,一種是遍歷,也是很普通的兩種方式。

《一》遞迴的方式

先看圖

先解釋一下乙個node有data和next,data是資料,next是指向下乙個節點,相當於c中的指標了。我們先放3個資料,圖中的1-3是一次完整的操作。

先想一哈這個怎麼寫,既然遞迴,而且是鍊錶就要傳入乙個頭結點,就是圖中的a節點,遞迴中要判斷,下乙個節點的是不是空節點來,來決定要不要再次呼叫自己去處理資料。

具體的遞迴方法怎麼寫,看圖裡面的資料是如何處理的,

注意的3點;

1.判斷是不是null節點,也就是找到最後乙個節點,並且返回出來作為第乙個節點

2.找到最後乙個節點後,將最後乙個節點的next指向自己,並將自己的next複製為null,將自己設定為最後乙個節點

3.遞迴是重複呼叫自己的

這個是node節點

public

class node

public

intgetdata()

public

void

setdata(int data)

public node getnext()

public

void

setnext(node next)

}

具體的遞迴方法看圖的操作去寫

public node ergodic(node heade)

//不斷呼叫自己找見最後乙個節點

node result=ergodic(heade.getnext());

//2.找到最後乙個節點後,將最後乙個節點的next指向自己,並將自己的next複製為null,將自己

//設定為最後乙個節點

heade.getnext().setnext(heade);

heade.setnext(null);

return result;

}

具體的執行大概說一下呼叫ergodic

將a作為heade傳入,判斷是不是最後乙個節點,

呼叫ergodic並傳入a的next節點即b節點,判斷b節點不是最後乙個節點,呼叫ergodic傳入b節點的next,即c節點,c節點是最後乙個節點,returnc節點,result是c節點。此時的heade是b節點,將b節點的next節點的next設定為b節點,就是c節點next設定為b節點**,header現在還是b節點,將b節點的next設定為null,return了c節點,此時的result是剛才返回的c節點,heade是a節點,將a節點的next節點的next設定為a節點,即b節點的next設定為a節點,a節點的的next設定為null,返回c節點。

到此整個遞迴就走完了。返回的是c節點,即圖中3的結果。c指向b,b指向a,反轉結束了。

《一》遍歷反轉

就是將b節點next中的節點暫時記錄,將a節點和b節點,的next重新設定,a節點的next設定為null,b節點的next設定為a節點,再進行下一輪的互換,c節點和b節點的next互換,c節點的next指向b節點,

具體**

public

static node ergodic(node head)

node pre=head;//第乙個節點

node cur=head.getnext();//第二個節點

node tmp;

while (cur!=null)

head.setnext(null);

return pre;

}

整體的**:

import com.sun.xml.internal.bind.util.which;

public

class listflip

// 遞迴反轉後

node = ergodic(heaednode);

while (node != null)

}// 遞迴反轉

public

static node reversel(node head)

node renode = reversel(head.getnext());

head.getnext().setnext(head);

head.setnext(null);

return renode;

}// 遍歷反轉

public

static node ergodic(node head)

node pre=head;//第乙個節點

node cur=head.getnext();//第二個節點

node tmp;

while (cur!=null)

head.setnext(null);

return pre;}}

反轉單鏈表(java)

反轉單鏈表 輸入煉表頭節點,輸入反轉後的煉表頭節點 第一次想到的解法 時間和空間複雜度較高 將單鏈表每個節點依次讀入到棧中,然後出棧,重新連線成反轉後的單鏈表 public static listnode convert listnode node stack stack new stack 入棧 ...

單鏈表反轉 java版

head a b c 變成 head c b a 我們可以用迴圈的方式去實現,遍歷一次鍊錶即可。1.用乙個臨時變數tmp儲存 a的下乙個元素b,a的next指向null,即 由頭變尾 head指向null。head null a b c tmp b 2.因為此時tmp就是b,所以將tmp指向tmp的...

單鏈表反轉

單鏈表反轉,可以用迴圈做,當然也可以遞迴 詳見 include includestruct node 3 1 4 6 2 1 1 3 4 6 2 2 4 1 3 6 2 3 6 4 1 3 2 4 2 6 4 1 3 5 迴圈反轉,即依次改動3個指標值,直到鍊錶反轉完成 比如,上面第 1 行到第 2...