生活随笔
收集整理的這篇文章主要介紹了
单链表进阶学习 二段
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
單鏈表進(jìn)階學(xué)習(xí) 二段
單鏈表的反轉(zhuǎn)
思路:
定義一個(gè)新節(jié)點(diǎn),reserveHead=new HeroNode();利用輔助變量cur遍歷原來(lái)的鏈表,每遍歷一個(gè)節(jié)點(diǎn)就將其取出,放在新建鏈表的最前端;(這里可能理解上有些難度,舉一個(gè)簡(jiǎn)單的例子: 首先遍歷到原來(lái)鏈表第一個(gè)節(jié)點(diǎn),取出,接到新節(jié)點(diǎn)reserveHead的后面;接著遍歷到原來(lái)鏈表的第二個(gè)節(jié)點(diǎn),取出,這個(gè)時(shí)候把reserveHead的next域指向到新取出的節(jié)點(diǎn)(這里就是原來(lái)鏈表的第二個(gè)節(jié)點(diǎn)),新取出節(jié)點(diǎn)的next域指向前一個(gè)取出的節(jié)點(diǎn)(這里就是原來(lái)鏈表的第二個(gè)節(jié)點(diǎn));這樣就構(gòu)成了擁有兩個(gè)有效節(jié)點(diǎn)的單鏈表的反轉(zhuǎn)。如果一個(gè)單鏈表里有更多的節(jié)點(diǎn),就按照上述的思路遞歸重復(fù))把原來(lái)鏈表的頭節(jié)點(diǎn)指向新鏈表的第一個(gè)節(jié)點(diǎn)head.next=reserveHead.next;
(注:
反轉(zhuǎn)意味著要將原鏈表破壞,在原鏈表的基礎(chǔ)上打印逆序的鏈表;而不是新建一個(gè)鏈表,把原來(lái)的節(jié)點(diǎn)直接取出來(lái)接在新鏈表頭的后面直接打印出來(lái)。這就是上面第三步思路存在的必要性!!!)
public class SingleLinkedListDemo {public static void main(String
[] args
) {HeroNode hero1
= new HeroNode(1, "呼保義", "宋江");HeroNode hero2
= new HeroNode(2, "玉麒麟", "盧俊義");HeroNode hero3
= new HeroNode(3, "智多星", "吳用");HeroNode hero4
= new HeroNode(4, "入云龍", "公孫勝");HeroNode hero5
= new HeroNode(5, "大刀", "關(guān)勝");SingleLinkedList singleLinkedList
= new SingleLinkedList();singleLinkedList
.add(hero1
);singleLinkedList
.add(hero2
);singleLinkedList
.add(hero3
);singleLinkedList
.add(hero4
);singleLinkedList
.add(hero5
);System
.out
.println("原鏈表:");singleLinkedList
.list();System
.out
.println();System
.out
.println("反轉(zhuǎn)后的鏈表:");reverseList(singleLinkedList
.GetHead());singleLinkedList
.list();}public static void reverseList(HeroNode head
) {if(head
.next
==null
||head
.next
.next
==null
) {return;}HeroNode cur
=head
.next
;HeroNode next
=null
;HeroNode reverseHead
= new HeroNode(0, "", "");while(cur
!=null
) {next
=cur
.next
;cur
.next
=reverseHead
.next
;reverseHead
.next
=cur
;cur
=next
;}head
.next
=reverseHead
.next
;}public static HeroNode
findLastIndexNode(HeroNode head
, int index
) {if (head
.next
== null
) {return null
;}int size
= GetNumber(head
);if (index
<= 0 || index
> size
) {return null
;}HeroNode cur
= head
.next
;for (int i
= 0; i
< size
- index
; i
++) {cur
= cur
.next
;}return cur
;}public static int GetNumber(HeroNode head
) {if (head
.next
== null
) {return 0;}int number
= 0;HeroNode cur
= head
.next
;while (cur
!= null
) {number
++;cur
= cur
.next
;}return number
;}
}
class SingleLinkedList {private HeroNode head
= new HeroNode(0, "", "");public HeroNode
GetHead() {return head
;}public void add(HeroNode heroNode
) {HeroNode temp
= head
;while (true) {if (temp
.next
== null
) {break;}temp
= temp
.next
;}temp
.next
= heroNode
;}public void addByOrder(HeroNode heroNode
) {HeroNode temp
= head
;boolean flag
= false;while (true) {if (temp
.next
== null
) {break;}if (temp
.next
.no
> heroNode
.no
) {break;} else if (temp
.next
.no
== heroNode
.no
) {flag
= true;break;} else {temp
= temp
.next
;}}if (flag
) {System
.out
.printf("已有編號(hào)%d,添加失敗~~~\n", heroNode
.no
);} else {heroNode
.next
= temp
.next
;temp
.next
= heroNode
;}}public void update(HeroNode newHeroNode
) {if (head
.next
== null
) {System
.out
.println("鏈表為空~~~");return;}HeroNode temp
= head
.next
;boolean flag
= false;while (true) {if (temp
== null
) {break;} else if (temp
.no
== newHeroNode
.no
) {flag
= true;break;}temp
= temp
.next
;}if (flag
) {temp
.name
= newHeroNode
.name
;temp
.nickname
= newHeroNode
.nickname
;}else {System
.out
.println();System
.out
.printf("沒(méi)有找到編號(hào)為%d 的好漢,不能刪除😔\n");}}public void del(int no
) {HeroNode temp
= head
;boolean flag
= false;while (true) {if (temp
.next
== null
) {break;} else if (temp
.next
.no
== no
) {flag
= true;break;}temp
= temp
.next
;}if (flag
) {temp
.next
= temp
.next
.next
;} else {System
.out
.println();System
.out
.printf("刪除的數(shù)據(jù)%d不存在呀不存在~~~\n", no
);}}public void list() {if (head
.next
== null
) {System
.out
.println("鏈表為空~~~");return;}HeroNode temp
= head
.next
;while (true) {if (temp
== null
) {break;}System
.out
.println();System
.out
.printf("%-6s",temp
);temp
= temp
.next
;}}}
class HeroNode {public int no
;public String name
;public String nickname
;public HeroNode next
;public HeroNode(int no
, String nickname
, String name
) {this.no
= no
;this.nickname
= nickname
;this.name
= name
;}@Overridepublic String
toString() {return "no= " + no
+ ",nickname= " + nickname
+ ",name = " + name
;}}
總結(jié)
以上是生活随笔為你收集整理的单链表进阶学习 二段的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。