日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

数据结构 - 单链表(百度面试题单链表的倒序打印)

發(fā)布時(shí)間:2023/12/10 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 - 单链表(百度面试题单链表的倒序打印) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

方法1:反轉(zhuǎn)打印(但是會(huì)改變鏈表結(jié)構(gòu),不建議)

https://blog.csdn.net/weixin_43736084/article/details/101939789

方法2:存入棧中,在出棧

public static void reversePrint(HeroNode head){if (head.next == null){return;}//創(chuàng)建棧Stack<HeroNode> stack = new Stack<>();HeroNode cur = head.next;while(cur != null){stack.push(cur);cur = cur.next;}while (stack.size()>0){System.out.println(stack.pop());}}

源代碼

package DataStructures.LinkedList;import java.util.Stack;public class SingleLinedListDemo {public static void main(String[] args) {//進(jìn)行測(cè)試//先創(chuàng)建節(jié)點(diǎn)HeroNode hero1 = new HeroNode(1, "宋江", "及時(shí)雨");HeroNode hero2 = new HeroNode(2, "盧俊義", "玉麒麟");HeroNode hero3 = new HeroNode(3, "吳用", "智多星");HeroNode hero4 = new HeroNode(4, "林沖", "豹子頭");//創(chuàng)建要給的鏈表SingleLinkedList linkedList = new SingleLinkedList();//加入(按照no序號(hào)排序)linkedList.addByOrder(hero1);linkedList.addByOrder(hero4);linkedList.addByOrder(hero2);linkedList.addByOrder(hero3);//測(cè)試逆序打印單鏈表reversePrint(linkedList.getHead());}// 1.獲取到單鏈表的節(jié)點(diǎn)的個(gè)數(shù)(如果有頭結(jié)點(diǎn),不統(tǒng)計(jì)頭結(jié)點(diǎn))public static int getLength(HeroNode head){if (head.next == null){return 0;}int length = 0;//定義一個(gè)輔助變量,HeroNode cur = head.next;while(cur !=null){length++;cur = cur.next;//遍歷}return length;}//查找單鏈表中的倒數(shù)第K個(gè)節(jié)點(diǎn)【新浪面試題】//思路// 1.編寫(xiě)一個(gè)方法,節(jié)后head節(jié)點(diǎn),同時(shí)接收一個(gè)index// 2.index表示倒數(shù)第index個(gè)節(jié)點(diǎn)// 3.先把鏈表從頭到尾遍歷,得到鏈表的總長(zhǎng)度// 4.得到size后從鏈表的第一個(gè)開(kāi)始遍歷,遍歷size-index個(gè)就可以得到// 如果找到了,則返回該節(jié)點(diǎn),否則返回nullpublic static HeroNode fidLastIndexNode(HeroNode head, int index){//判斷如果為空,則返回nullif (head.next == null){return null;}//第一個(gè)遍歷得到鏈表的長(zhǎng)度(節(jié)點(diǎn)個(gè)數(shù))//先做一個(gè)index的校驗(yàn)int size = getLength(head);if (index<=0 || index> size){return null;}//定義輔助變量HeroNode temp = head.next;//遍歷,for循環(huán)定位到倒數(shù)的index個(gè)for (int i=0; i<size - index; i++){temp = temp.next;}return temp;}//單鏈表的反轉(zhuǎn)public static void reverseList(HeroNode head){//如果當(dāng)前鏈表為空,或只有一個(gè)節(jié)點(diǎn),無(wú)需反轉(zhuǎn)if (head.next == null || head.next.next == null){return ;}//定義一個(gè)輔助變量,幫助我們遍歷HeroNode cur = head.next;HeroNode next = null;//指向當(dāng)前節(jié)點(diǎn)[cur]的下一個(gè)節(jié)點(diǎn)HeroNode reverseHead = new HeroNode(0,"","");//遍歷原來(lái)的鏈表,每遍歷一個(gè)節(jié)點(diǎn),就將其取出,并放到reverseHeadwhile(cur != null){next = cur.next;//先保存當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)cur.next = reverseHead.next;reverseHead.next = cur;//cur的下一個(gè)節(jié)點(diǎn)指向新的鏈表的最前端cur = next; //把記錄的cur.next賦給cur}//將head.next 指向 reverseHead.next,實(shí)現(xiàn)單鏈表反轉(zhuǎn)head.next = reverseHead.next;}public static void reversePrint(HeroNode head){if (head.next == null){return;}//創(chuàng)建棧Stack<HeroNode> stack = new Stack<>();HeroNode cur = head.next;while(cur != null){stack.push(cur);cur = cur.next;}while (stack.size()>0){System.out.println(stack.pop());}} }//定義一個(gè)SingleLinkedList 管理人物 class SingleLinkedList{//初始化一個(gè)頭結(jié)點(diǎn),頭結(jié)點(diǎn)不要?jiǎng)?#xff0c;不存放具體數(shù)據(jù)private HeroNode head = new HeroNode(0,"","");public HeroNode getHead() {return head;}//添加節(jié)點(diǎn)到單鏈表//思路:當(dāng)不考慮編號(hào)的順序時(shí)//1.找到當(dāng)前鏈表的最后節(jié)點(diǎn)//2.將最后這個(gè)節(jié)點(diǎn)的next 指向 新的節(jié)點(diǎn)public void add(HeroNode heroNode){//因?yàn)閔ead節(jié)點(diǎn)不能動(dòng),因此我們需要一個(gè)輔助變量 tempHeroNode temp = head;//遍歷鏈表,找到最后while(true){//找到鏈表的最后if(temp.next == null){break;}//如果沒(méi)找到,temp后移temp = temp.next;}//當(dāng)退出while循環(huán)時(shí)temp指向了鏈表的最后//將最后這個(gè)節(jié)點(diǎn)的next 指向 新的節(jié)點(diǎn)temp.next = heroNode;}//第二種方式在添加人物的時(shí)候,根據(jù)排名將英雄插入到指定位置//(如果有這個(gè)排名,則添加失敗,并給出提示)public void addByOrder(HeroNode heroNode){//因?yàn)轭^結(jié)點(diǎn)不能動(dòng),我們?nèi)匀恍枰ㄟ^(guò)一個(gè)輔助變量來(lái)幫助找到添加的位置//因?yàn)閱捂湵?#xff0c;因此我們找的temp是位于添加位置的前一個(gè)節(jié)點(diǎn),否則插入不了,因?yàn)榍耙粋€(gè)節(jié)點(diǎn)next才可以找到新插入的HeroNode temp = head;boolean flag = false;while (true) {if (temp.next == null) {//說(shuō)明temp已經(jīng)在鏈表最后break;}if (temp.next.no > heroNode.no) { //位置找到,就在temp后面插入break;}else if (temp.next.no == heroNode.no){//說(shuō)明新添加的編號(hào)存在flag = true;//說(shuō)明編號(hào)存在break;}temp = temp.next; //后移}//判斷flag 的值if(flag){//不能添加,已經(jīng)存在System.out.printf("人物編號(hào)%d 已經(jīng)存在,不能添加\n",heroNode.no);} else {//插入到鏈表中,temp后heroNode.next = temp.next; //連接新的節(jié)點(diǎn)的next和下一個(gè)的datatemp.next = heroNode; //連接上一個(gè)節(jié)點(diǎn)的next和新節(jié)點(diǎn)的數(shù)據(jù)}}//修改節(jié)點(diǎn)信息,根據(jù)no來(lái)修改,no不能改變public void updata(HeroNode newHeroNode){//判斷是否為空if (head.next == null){System.out.println("鏈表為空");return;}//找到需要修改的節(jié)點(diǎn),根據(jù)no編號(hào)//定義一個(gè)輔助變量HeroNode temp = head.next;boolean flag = false;while (true){if (temp == null){break;//已經(jīng)遍歷完}if (temp.no == newHeroNode.no){//找到flag = true;break;}temp = temp.next;}//判斷flag ,是否找到需要修改的if (flag){temp.name = newHeroNode.name;temp.nickName = newHeroNode.nickName;}else {//沒(méi)找到System.out.printf("沒(méi)有找到編號(hào):%d 的節(jié)點(diǎn),不能修改",newHeroNode.no);}}//刪除節(jié)點(diǎn)//思路:// 1.先找到需要?jiǎng)h除的這個(gè)節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),// 2.temp.next = temp.next.next// 被刪除的節(jié)點(diǎn)沒(méi)有引用指向,會(huì)被GC回收public void delete(int no){if (head.next == null){System.out.println("鏈表為空,不能刪除");return;}//找到需要修改的節(jié)點(diǎn),根據(jù)no編號(hào)//定義一個(gè)輔助變量HeroNode temp = head;boolean flag = false;//標(biāo)記是否找到待刪除的節(jié)點(diǎn)while (true){if (temp.next == null){ //節(jié)點(diǎn)遍歷完畢break;}if (temp.next.no == no){//找到節(jié)點(diǎn)noflag = true;break;}temp = temp.next; //temp后移}if (flag){//找到notemp.next = temp.next.next;}else {System.out.printf("鏈表里沒(méi)有no為:%d 的節(jié)點(diǎn)\n",no);}}//展示鏈表public void list(){//先判斷鏈表是否為空if (head.next == null){return;}//因?yàn)轭^結(jié)點(diǎn)不能動(dòng),因此我們需要一個(gè)輔助變量來(lái)遍歷HeroNode temp = head.next;while(true){//判斷鏈表是否為空if (temp == null){break;}//輸出節(jié)點(diǎn)信息System.out.println(temp);//將temp后移,一定要temp = temp.next;}}}//定義一個(gè)heroNode,每個(gè)heroNode就是一個(gè)節(jié)點(diǎn) class HeroNode{public int no;public String name;public String nickName;public HeroNode next; //指向下一個(gè)節(jié)點(diǎn)//構(gòu)造器public HeroNode(int no, String name, String nickname){this.no = no;this.name = name;this.nickName = nickname;}//為了顯示方便重寫(xiě)toString@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickName='" + nickName + '\'' +'}';} }

總結(jié)

以上是生活随笔為你收集整理的数据结构 - 单链表(百度面试题单链表的倒序打印)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。