日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java单链表反转

發布時間:2023/12/3 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java单链表反转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自???Java單鏈表反轉 詳細過程

(一)單鏈表的結點結構: 

? ????data域:存儲數據元素信息的域稱為數據域; 
? ??next域:存儲直接后繼位置的域稱為指針域,它是存放結點的直接后繼的地址(位置)的指針域(鏈域)。
? ??data域+ next域:組成數據ai的存儲映射,稱為結點

? ??注意:①鏈表通過每個結點的鏈域將線性表的n個結點按其邏輯順序鏈接在一起的。   
? ? ? ? ? ②每個結點只有一個鏈域的鏈表稱為單鏈表(Single Linked List)。
? ? ?所謂的鏈表就好像火車車廂一樣,從火車頭開始,每一節車廂之后都連著后一節車廂。
? ? ?要實現單鏈表存儲,首先是創建一結點類,其Java代碼如下:

[java]?view plain?copy

  • class?Node?{??
  • ????private?int?Data;//?數據域??
  • ????private?Node?Next;//?指針域??
  • ????public?Node(int?Data)?{??
  • ????????//?super();??
  • ????????this.Data?=?Data;??
  • ????}??
  • ????public?int?getData()?{??
  • ????????return?Data;??
  • ????}??
  • ????public?void?setData(int?Data)?{??
  • ????????this.Data?=?Data;??
  • ????}??
  • ??
  • ????public?Node?getNext()?{??
  • ????????return?Next;??
  • ????}??
  • ????public?void?setNext(Node?Next)?{??
  • ????????this.Next?=?Next;??
  • ????}??
  • }??
  • (二)實現反轉的方法:
    ??(1)遞歸反轉法
    :在反轉當前節點之前先反轉后續節點。這樣從頭結點開始,層層深入直到尾結點才開始反轉指針域的指向。簡單的說就是從尾結點開始,逆向反轉各個結點的指針域指向,其過程圖如下所示:
    ? ?head:是前一結點的指針域(PS:前一結點的指針域指向當前結點)
    ? ?head.getNext():是當前結點的指針域(PS:當前結點的指針域指向下一結點)
    ? ?reHead:是反轉后新鏈表的頭結點(即原來單鏈表的尾結點)

    Java代碼實現:

    [java]?view plain?copy

  • package?javatest1;??
  • public?class?javatest1?{??
  • ????public?static?void?main(String[]?args)?{??
  • ????????Node?head?=?new?Node(0);??
  • ????????Node?node1?=?new?Node(1);??
  • ????????Node?node2?=?new?Node(2);??
  • ????????Node?node3?=?new?Node(3);??
  • ????????head.setNext(node1);??
  • ????????node1.setNext(node2);??
  • ????????node2.setNext(node3);??
  • ??
  • ????????//?打印反轉前的鏈表??
  • ????????Node?h?=?head;??
  • ????????while?(null?!=?h)?{??
  • ????????????System.out.print(h.getData()?+?"?");??
  • ????????????h?=?h.getNext();??
  • ????????}??
  • ????????//?調用反轉方法??
  • ????????head?=?Reverse1(head);??
  • ??
  • ????????System.out.println("\n**************************");??
  • ????????//?打印反轉后的結果??
  • ????????while?(null?!=?head)?{??
  • ????????????System.out.print(head.getData()?+?"?");??
  • ????????????head?=?head.getNext();??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?遞歸,在反轉當前節點之前先反轉后續節點?
  • ?????*/??
  • ????public?static?Node?Reverse1(Node?head)?{??
  • ????????//?head看作是前一結點,head.getNext()是當前結點,reHead是反轉后新鏈表的頭結點??
  • ????????if?(head?==?null?||?head.getNext()?==?null)?{??
  • ????????????return?head;//?若為空鏈或者當前結點在尾結點,則直接還回??
  • ????????}??
  • ????????Node?reHead?=?Reverse1(head.getNext());//?先反轉后續節點head.getNext()??
  • ????????head.getNext().setNext(head);//?將當前結點的指針域指向前一結點??
  • ????????head.setNext(null);//?前一結點的指針域令為null;??
  • ????????return?reHead;//?反轉后新鏈表的頭結點??
  • ????}??
  • }??
  • ??
  • ????class?Node?{??
  • ????????private?int?Data;//?數據域??
  • ????????private?Node?Next;//?指針域??
  • ??
  • ????????public?Node(int?Data)?{??
  • ????????????//?super();??
  • ????????????this.Data?=?Data;??
  • ????????}??
  • ??
  • ????????public?int?getData()?{??
  • ????????????return?Data;??
  • ????????}??
  • ??
  • ????????public?void?setData(int?Data)?{??
  • ????????????this.Data?=?Data;??
  • ????????}??
  • ??
  • ????????public?Node?getNext()?{??
  • ????????????return?Next;??
  • ????????}??
  • ??
  • ????????public?void?setNext(Node?Next)?{??
  • ????????????this.Next?=?Next;??
  • ????????}??
  • ????}??
  • ?

    (2)遍歷反轉法:遞歸反轉法是從后往前逆序反轉指針域的指向,而遍歷反轉法是從前往后反轉各個結點的指針域的指向。

    ? ?基本思路是:將當前節點cur的下一個節點 cur.getNext()緩存到temp后,然后更改當前節點指針指向上一結點pre。也就是說在反轉當前結點指針指向前,先把當前結點的指針域用tmp臨時保存,以便下一次使用,其過程可表示如下:
    ? ?pre:上一結點
    ? ?cur:?當前結點
    ? ?tmp:?臨時結點,用于保存當前結點的指針域(即下一結點)

    ?

    Java代碼實現:

    [java]?view plain?copy

  • package?javatest1;??
  • public?class?JavaTest1?{??
  • ????public?static?void?main(String[]?args)?{??
  • ????????Node?head?=?new?Node(0);??
  • ????????Node?node1?=?new?Node(1);??
  • ????????Node?node2?=?new?Node(2);??
  • ????????Node?node3?=?new?Node(3);??
  • ??
  • ????????head.setNext(node1);??
  • ????????node1.setNext(node2);??
  • ????????node2.setNext(node3);??
  • ??
  • ????????//?打印反轉前的鏈表??
  • ????????Node?h?=?head;??
  • ????????while?(null?!=?h)?{??
  • ????????????System.out.print(h.getData()?+?"?");??
  • ????????????h?=?h.getNext();??
  • ????????}??
  • ????????//?調用反轉方法??
  • ????????//?head?=?reverse1(head);??
  • ????????head?=?reverse2(head);??
  • ??
  • ????????System.out.println("\n**************************");??
  • ????????//?打印反轉后的結果??
  • ????????while?(null?!=?head)?{??
  • ????????????System.out.print(head.getData()?+?"?");??
  • ????????????head?=?head.getNext();??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?遍歷,將當前節點的下一個節點緩存后更改當前節點指針?
  • ?????*/??
  • ????public?static?Node?reverse2(Node?head)?{??
  • ????????if?(head?==?null)??
  • ????????????return?head;??
  • ????????Node?pre?=?head;//?上一結點??
  • ????????Node?cur?=?head.getNext();//?當前結點??
  • ????????Node?tmp;//?臨時結點,用于保存當前結點的指針域(即下一結點)??
  • ????????while?(cur?!=?null)?{//?當前結點為null,說明位于尾結點??
  • ????????????tmp?=?cur.getNext();??
  • ????????????cur.setNext(pre);//?反轉指針域的指向??
  • ??
  • ????????????//?指針往下移動??
  • ????????????pre?=?cur;??
  • ????????????cur?=?tmp;??
  • ????????}??
  • ????????//?最后將原鏈表的頭節點的指針域置為null,還回新鏈表的頭結點,即原鏈表的尾結點??
  • ????????head.setNext(null);??
  • ??????????
  • ????????return?pre;??
  • ????}??
  • }??
  • ??
  • class?Node?{??
  • ????private?int?Data;//?數據域??
  • ????private?Node?Next;//?指針域??
  • ??
  • ????public?Node(int?Data)?{??
  • ????????//?super();??
  • ????????this.Data?=?Data;??
  • ????}??
  • ??
  • ????public?int?getData()?{??
  • ????????return?Data;??
  • ????}??
  • ??
  • ????public?void?setData(int?Data)?{??
  • ????????this.Data?=?Data;??
  • ????}??
  • ??
  • ????public?Node?getNext()?{??
  • ????????return?Next;??
  • ????}??
  • ??
  • ????public?void?setNext(Node?Next)?{??
  • ????????this.Next?=?Next;??
  • ????}??
  • }??
  • ?
  • 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Java单链表反转的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。