單鏈表反轉(zhuǎn)

單鏈表反轉(zhuǎn)

很多時候工作和面試的時候都會遇到類似的單鏈表反轉(zhuǎn)的情況冀宴,今天就參考寫了一個,類似數(shù)據(jù)結構和算法的知識允瞧,最主要的不是代碼而是思路和思維方式易阳;盡管這方面我也只是很普通的一位叁幢,于是在努力進步的道路上钞馁。

實現(xiàn)的兩種方式:主要是以java形式來實現(xiàn)。

遞歸方式

反轉(zhuǎn)的本質(zhì)是指向方向比如 A->B->C->D 那么遞歸來實現(xiàn)二打,判斷如果后面還有元素县忌,那么就先讓后面的元素反轉(zhuǎn),進而向前遞歸继效,先反轉(zhuǎn)A但是A下一個元素有B所以就先反轉(zhuǎn)B但是B下一個元素是C症杏,以此類推,最先反轉(zhuǎn)的是D. 代碼實現(xiàn)

//遞歸
public static Node reverse(Node header){
    if (header == null || header.getNext() == null){
        return header;
    }
    Node rehead = reverse(header.getNext());// 先反轉(zhuǎn)后一元素
    header.getNext().setNext(header);//將當前節(jié)點指向前一節(jié)點
    header.setNext(null);
    return rehead;
}

非遞歸方式(遍歷方式)

我們大部分人還是正向思維瑞信,也就是平時用的比較多的遍歷思維厉颤,正向的思考,遞歸是反向的思維方式凡简,計算機科學思維使用最多的方式之一逼友。遍歷代碼實現(xiàn)如下:

public static Node reverse2(Node head) {
    if (head != null) {
        Node prevNode = head;//上一個節(jié)點
        Node currentNode = head.getNext();//當前節(jié)點
        Node tempNode;// 臨時結點,用于保存當前結點(即下一結點)
        while (currentNode != null) {
            tempNode = currentNode.getNext();
            currentNode.setNext(prevNode);//反轉(zhuǎn)指向


            //指向移動
            prevNode = currentNode;
            currentNode = tempNode;
        }
        head.setNext(null);
        return prevNode;
    }
    return null;
}

肯定會說搞一個完整的代碼運行下就啥也明白了秤涩,是的完整代碼下面就有惋砂,還是希望讀者可以先理解思路和簡單的實現(xiàn)方式或者代碼片段筷厘,最后再用完整的代碼來看效果便于記憶嘿棘。完整代碼實現(xiàn):

public class Node {
    private String data;

    private Node next;

    public Node(String data,Node next){
        this.data = data;
        this.next = next;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }


    public static void main(String[] args) {
        Node nodeE = new Node("E",null);
        Node nodeD = new Node("D",nodeE);
        Node nodeC = new Node("C",nodeD);
        Node nodeB = new Node("B",nodeC);
        Node nodeA = new Node("A",nodeB);

        Node node  = nodeA;
        while (node != null){
            System.out.println(node.data);
            node = node.getNext();
        }

        System.out.println("------------------------");
        Node nodeW = reverse(nodeA);
        while (nodeW != null){
            System.out.println(nodeW.data);
            nodeW = nodeW.getNext();
        }
    }

    //遞歸
    public static Node reverse(Node header){
        if (header == null || header.getNext() == null){
            return header;
        }
        Node rehead = reverse(header.getNext());// 先反轉(zhuǎn)后一元素
        header.getNext().setNext(header);//將當前節(jié)點指向前一節(jié)點
        header.setNext(null);
        return rehead;
    }

    //遍歷
    public static Node reverse2(Node head) {
        if (head != null) {
            Node prevNode = head;//上一個節(jié)點
            Node currentNode = head.getNext();//當前節(jié)點
            Node tempNode;// 臨時結點蔗包,用于保存當前結點(即下一結點)
            while (currentNode != null) {
                tempNode = currentNode.getNext();
                currentNode.setNext(prevNode);//反轉(zhuǎn)指向


                //指向移動
                prevNode = currentNode;
                currentNode = tempNode;
            }
            head.setNext(null);
            return prevNode;
        }
        return null;
    }
}

很多時候大家遇到問題第一件事情基本都是在找直接可以用的答案镶苞,然而大蝦或者大俠們第一個想到的是思路葛超,理解以及思維方式的鍛煉颁井。從中涉及到的知識點或者原理淫奔,如果我們也類似迷媒蚧或者懶墮的伸手黨振定,那我們也需要做出點什么改變來嘗試一下,也許會有意想不到的驚喜肉拓。以上寫法參考https://blog.csdn.net/guyuealian/article/details/51119499
后來發(fā)現(xiàn)一個更為簡潔的代碼實現(xiàn)可以參考:https://www.cnblogs.com/tina-smile/p/4878983.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末后频,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卑惜,老刑警劉巖膏执,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異露久,居然都是意外死亡更米,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門毫痕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來征峦,“玉大人,你說我怎么就攤上這事消请±赴剩” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵臊泰,是天一觀的道長蛉加。 經(jīng)常有香客問我,道長缸逃,這世上最難降的妖魔是什么针饥? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮需频,結果婚禮上打厘,老公的妹妹穿的比我還像新娘。我一直安慰自己贺辰,他們只是感情好户盯,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饲化,像睡著了一般莽鸭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吃靠,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天硫眨,我揣著相機與錄音,去河邊找鬼巢块。 笑死礁阁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的族奢。 我是一名探鬼主播姥闭,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼越走!你這毒婦竟也來了棚品?” 一聲冷哼從身側響起靠欢,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铜跑,沒想到半個月后门怪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡锅纺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年掷空,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囤锉。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拣帽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嚼锄,到底是詐尸還是另有隱情减拭,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布区丑,位于F島的核電站拧粪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沧侥。R本人自食惡果不足惜可霎,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宴杀。 院中可真熱鬧癣朗,春花似錦、人聲如沸旺罢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扁达。三九已至正卧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跪解,已是汗流浹背炉旷。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叉讥,地道東北人窘行。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像图仓,于是被迫代替她去往敵國和親罐盔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容