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

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

生活随笔

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

数据结构:链表面试题

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

1. 獲取單鏈表的節(jié)點(diǎn)的個(gè)數(shù)

2. 查找單鏈表中的倒數(shù)第k個(gè)節(jié)點(diǎn)

3.將單鏈表反轉(zhuǎn)

4.逆序打印鏈表

5.合并兩個(gè)有序的單鏈表

?

package com.linkedlist;import java.util.Stack;public class SingleLinkedListDemo {public static void main(String[] args){// 創(chuàng)建節(jié)點(diǎn)HeroNode h1 = new HeroNode(1, "宋江", "及時(shí)雨");HeroNode h2 = new HeroNode(3, "吳用", "智多星");HeroNode h3 = new HeroNode(5, "關(guān)勝", "大刀");HeroNode h4 = new HeroNode(7, "秦明", "霹靂火");SingleLinkedList list = new SingleLinkedList();// 直接將節(jié)點(diǎn)加到隊(duì)列末尾 // list.add(h1); // list.add(h2); // list.add(h3); // list.add(h4);// 按照編號(hào)順序加入list.addByOrder(h1);list.addByOrder(h4);list.addByOrder(h3);list.addByOrder(h2);System.out.println("按照編號(hào)順序加入后的鏈表情況...");list.list();// // 修改節(jié)點(diǎn) // HeroNode newHeroNode = new HeroNode(2, "魯智深", "花和尚"); // list.update(newHeroNode); // System.out.println("修改后的鏈表情況..."); // list.list(); // // // 刪除節(jié)點(diǎn) // list.del(2); // list.del(1); // System.out.println("刪除后的鏈表情況..."); // list.list();System.out.println("倒數(shù)第4個(gè)節(jié)點(diǎn):");HeroNode cur = findLastIndexNode(list.getHeroNode(), 4);System.out.println(cur);System.out.println("有效的節(jié)點(diǎn)個(gè)數(shù):"+getLength(list.getHeroNode()));System.out.println("逆序打印....");reversePrint(list.getHeroNode());System.out.println("list2....");SingleLinkedList list2 = new SingleLinkedList();// 創(chuàng)建節(jié)點(diǎn)HeroNode h5 = new HeroNode(2, "盧俊義", "玉麒麟");HeroNode h6 = new HeroNode(4, "公孫勝", "入云龍");HeroNode h7 = new HeroNode(6, "林沖", "豹子頭");HeroNode h8 = new HeroNode(8, "呼延灼", "雙鞭");list2.addByOrder(h8);list2.addByOrder(h6);list2.addByOrder(h5);list2.addByOrder(h7);list2.list();System.out.println("合并...");HeroNode merge = mergeList(list.getHeroNode(),list2.getHeroNode());System.out.println("單鏈表反轉(zhuǎn)后....");reverseList(list.getHeroNode());list.list();}// 面試題: 合并兩個(gè)有序的單鏈表public static HeroNode mergeList(HeroNode head1, HeroNode head2){HeroNode merge = new HeroNode(0, "", "");if(head1.next == null || head2.next == null){return null;}HeroNode temp1 = head1.next;HeroNode temp2 = head2.next;HeroNode temp3 = merge;while(temp1 != null && temp2 != null){if(temp1.no > temp2.no){temp3.next = temp2;temp2 = temp2.next;}else{temp3.next = temp1;temp1 = temp1.next;}temp3 = temp3.next;}if(temp1 != null){temp3.next = temp1;}if(temp2 != null){temp3.next = temp2;}// 因?yàn)轭^節(jié)點(diǎn),不能動(dòng),因此需要一個(gè)輔助變量來(lái)遍歷HeroNode temp = merge.next;while(true){// 判斷是否到鏈表最后if(temp == null){break;}// 輸出節(jié)點(diǎn)信息System.out.println(temp);temp = temp.next; // temp后移,指向下一個(gè)節(jié)點(diǎn)}return merge;}// 面試題: 逆序打印鏈表// 利用單鏈表這個(gè)數(shù)據(jù)結(jié)構(gòu),將各個(gè)節(jié)點(diǎn)壓入壓入到棧中,然后利用棧的先進(jìn)后出的特點(diǎn),就實(shí)現(xiàn)了逆序打印的效果public static void reversePrint(HeroNode head){if(head.next == null)return; // 空鏈表,不能打印// 創(chuàng)建一個(gè)棧,將各個(gè)節(jié)點(diǎn)壓入棧Stack<HeroNode> stack = new Stack<HeroNode>();HeroNode cur = head.next;// 將鏈表的所有節(jié)點(diǎn)壓入棧while(cur != null){stack.push(cur);cur = cur.next; // cur后移,這樣就可以壓入下一個(gè)節(jié)點(diǎn)}// 將棧中的節(jié)點(diǎn)打印, 出棧while(stack.size()>0){System.out.println(stack.pop());}}/*** 面試題: 將單鏈表反轉(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è)輔助指針,幫助我們遍歷原來(lái)的鏈表HeroNode cur = head.next;HeroNode next = null; // 指向當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)HeroNode reverseHead = new HeroNode(0, "", "");// 遍歷原來(lái)的鏈表, 每遍歷一個(gè)節(jié)點(diǎn),就將其取出,并放在新的鏈表reverseHead的最前端while(cur != null){next = cur.next; // 暫時(shí)保存當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)cur.next = reverseHead.next; // 將cur的下一個(gè)節(jié)點(diǎn)指向新的鏈表的最前端reverseHead.next = cur; // 將cur連接到新的鏈表上cur = next;// 讓cur后移}// 將head.next指向reverseHead的next,實(shí)現(xiàn)單鏈表的反轉(zhuǎn)head.next = reverseHead.next;}/*** 面試題: 查找單鏈表中的倒數(shù)第k個(gè)節(jié)點(diǎn)* @param head 鏈表的頭節(jié)點(diǎn)* @param index 倒數(shù)第index個(gè)節(jié)點(diǎn)* @return 如果找到了,返回該節(jié)點(diǎn). 否則返回null*/public static HeroNode findLastIndexNode(HeroNode head, int index){if(head.next == null)return null; // 沒(méi)有找到// 第一個(gè)遍歷得到鏈表的長(zhǎng)度int size = getLength(head);// 第二次遍歷 size-index位置,就是我們倒數(shù)的第k個(gè)節(jié)點(diǎn)// 先做一個(gè)index的校驗(yàn)if(index<=0 || index>size){return null;}// 定義一個(gè)輔助變量HeroNode cur = head.next;for(int i=0;i<size-index;i++){cur = cur.next;}return cur;}/*** 面試題: 獲取單鏈表的節(jié)點(diǎn)的個(gè)數(shù)(如果是帶頭節(jié)點(diǎn)的鏈表,不統(tǒng)計(jì)頭節(jié)點(diǎn))* @param head 鏈表的頭節(jié)點(diǎn)* @return 返回的是鏈表的節(jié)點(diǎn)個(gè)數(shù) */public static int getLength(HeroNode head){if(head.next == null){ // 空鏈表return 0;}int length = 0;HeroNode cur = head.next;while(cur != null){length++;cur = cur.next; // 遍歷}return length;} }// 定義鏈表,管理結(jié)點(diǎn)HeroNode class SingleLinkedList{// 先初始化一個(gè)頭節(jié)點(diǎn),頭節(jié)點(diǎn)不能動(dòng)private HeroNode head = new HeroNode(0, "", "");public HeroNode getHeroNode(){return head;}// 添加結(jié)點(diǎn)到單向鏈表,直接加到最后結(jié)點(diǎn)的后面public void add(HeroNode heroNode){// 找到當(dāng)前鏈表的最后節(jié)點(diǎn),將最后這個(gè)節(jié)點(diǎn)的next,指向新的節(jié)點(diǎn)HeroNode 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)temp.next = heroNode;}// 修改節(jié)點(diǎn)的信息,根據(jù)no編號(hào)來(lái)修改,即no編號(hào)不能改// 1. 根據(jù)newHeroNode的no來(lái)修改public void update(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; // 表示是否找到改節(jié)點(diǎn)while(true){if(temp == null){break; // 到鏈表的最后}if(temp.no == newHeroNode.no){// 找到flag = true;break;}temp = temp.next;}if(flag){temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;}else{ // 沒(méi)有找到System.out.printf("沒(méi)有找到編號(hào)%d的節(jié)點(diǎn),不能修改\n", newHeroNode.no);}}// 刪除節(jié)點(diǎn)// head不能動(dòng), 因此我們需要一個(gè)temp輔助節(jié)點(diǎn)找到待刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)public void del(int no){HeroNode temp = head;boolean flag = false; // 標(biāo)志是否找到待刪除節(jié)點(diǎn)while(true){if(temp.next == null){break;}if(temp.next.no == no){flag = true;break;}temp = temp.next; // temp后移}if(flag){ // 找到// 可以刪除temp.next = temp.next.next;}else{System.out.printf("要?jiǎng)h除的%d 節(jié)點(diǎn)不存在\n", no);}}// 第二種添加英雄的方式,根據(jù)排名將英雄插入到指定位置public void addByOrder(HeroNode heroNode){// 因?yàn)轭^節(jié)點(diǎn)不能動(dòng),因此我們?nèi)匀煌ㄟ^(guò)一個(gè)輔助指針來(lái)幫助找到添加的位置// 因?yàn)槭菃捂湵?因此我們要找到temp是位于添加位置的前一個(gè)節(jié)點(diǎn)HeroNode temp = head;boolean flag = false;while(true){if(temp.next == null){// 說(shuō)明temp已經(jīng)在鏈表的最后break;}if(temp.next.no > heroNode.no){break;}else if(temp.next.no == heroNode.no){flag = true; // 說(shuō)明編號(hào)已經(jīng)存在break;}temp = temp.next;}// 判斷flag的值if(flag){ // 不能添加,說(shuō)明編號(hào)存在System.out.printf("準(zhǔn)備插入的英雄的編號(hào)%d已經(jīng)存在,不能加入\n",heroNode.no);}else{// 插入到鏈表中heroNode.next = temp.next;temp.next = heroNode;}}// 顯示鏈表(遍歷)public void list(){// 判斷鏈表是否為空if(head.next == null){System.out.println("判斷鏈表是否為空...");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.next; // temp后移,指向下一個(gè)節(jié)點(diǎn)}} }// 定義HearNode,每個(gè)HearNode對(duì)象就是一個(gè)結(jié)點(diǎn) class HeroNode{public int no;public String name;public String nickname;public HeroNode next;public HeroNode(int no, String name, String nickname){this.no = no;this.name = name;this.nickname = nickname;}@Overridepublic String toString() {return "HeroNode [no=" + no + ", name=" + name + ", nickname="+ nickname + "]";}}

?

總結(jié)

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

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