前段時間有同事面試,給面試的人都提乙個演算法問題那就是單鏈表的反轉,好多小夥伴都不會,或者表示一聽演算法就懵逼了,自己寫了乙個。就是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)
}
具體的執行大概說一下呼叫ergodicpublic node ergodic(node heade)
//不斷呼叫自己找見最後乙個節點
node result=ergodic(heade.getnext());
//2.找到最後乙個節點後,將最後乙個節點的next指向自己,並將自己的next複製為null,將自己
//設定為最後乙個節點
heade.getnext().setnext(heade);
heade.setnext(null);
return result;
}
將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...