数据结构:链表面试题
生活随笔
收集整理的這篇文章主要介紹了
数据结构:链表面试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 獲取單鏈表的節點的個數
2. 查找單鏈表中的倒數第k個節點
3.將單鏈表反轉
4.逆序打印鏈表
5.合并兩個有序的單鏈表
?
package com.linkedlist;import java.util.Stack;public class SingleLinkedListDemo {public static void main(String[] args){// 創建節點HeroNode h1 = new HeroNode(1, "宋江", "及時雨");HeroNode h2 = new HeroNode(3, "吳用", "智多星");HeroNode h3 = new HeroNode(5, "關勝", "大刀");HeroNode h4 = new HeroNode(7, "秦明", "霹靂火");SingleLinkedList list = new SingleLinkedList();// 直接將節點加到隊列末尾 // list.add(h1); // list.add(h2); // list.add(h3); // list.add(h4);// 按照編號順序加入list.addByOrder(h1);list.addByOrder(h4);list.addByOrder(h3);list.addByOrder(h2);System.out.println("按照編號順序加入后的鏈表情況...");list.list();// // 修改節點 // HeroNode newHeroNode = new HeroNode(2, "魯智深", "花和尚"); // list.update(newHeroNode); // System.out.println("修改后的鏈表情況..."); // list.list(); // // // 刪除節點 // list.del(2); // list.del(1); // System.out.println("刪除后的鏈表情況..."); // list.list();System.out.println("倒數第4個節點:");HeroNode cur = findLastIndexNode(list.getHeroNode(), 4);System.out.println(cur);System.out.println("有效的節點個數:"+getLength(list.getHeroNode()));System.out.println("逆序打印....");reversePrint(list.getHeroNode());System.out.println("list2....");SingleLinkedList list2 = new SingleLinkedList();// 創建節點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("單鏈表反轉后....");reverseList(list.getHeroNode());list.list();}// 面試題: 合并兩個有序的單鏈表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;}// 因為頭節點,不能動,因此需要一個輔助變量來遍歷HeroNode temp = merge.next;while(true){// 判斷是否到鏈表最后if(temp == null){break;}// 輸出節點信息System.out.println(temp);temp = temp.next; // temp后移,指向下一個節點}return merge;}// 面試題: 逆序打印鏈表// 利用單鏈表這個數據結構,將各個節點壓入壓入到棧中,然后利用棧的先進后出的特點,就實現了逆序打印的效果public static void reversePrint(HeroNode head){if(head.next == null)return; // 空鏈表,不能打印// 創建一個棧,將各個節點壓入棧Stack<HeroNode> stack = new Stack<HeroNode>();HeroNode cur = head.next;// 將鏈表的所有節點壓入棧while(cur != null){stack.push(cur);cur = cur.next; // cur后移,這樣就可以壓入下一個節點}// 將棧中的節點打印, 出棧while(stack.size()>0){System.out.println(stack.pop());}}/*** 面試題: 將單鏈表反轉*/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, "", "");// 遍歷原來的鏈表, 每遍歷一個節點,就將其取出,并放在新的鏈表reverseHead的最前端while(cur != null){next = cur.next; // 暫時保存當前節點的下一個節點cur.next = reverseHead.next; // 將cur的下一個節點指向新的鏈表的最前端reverseHead.next = cur; // 將cur連接到新的鏈表上cur = next;// 讓cur后移}// 將head.next指向reverseHead的next,實現單鏈表的反轉head.next = reverseHead.next;}/*** 面試題: 查找單鏈表中的倒數第k個節點* @param head 鏈表的頭節點* @param index 倒數第index個節點* @return 如果找到了,返回該節點. 否則返回null*/public static HeroNode findLastIndexNode(HeroNode head, int index){if(head.next == null)return null; // 沒有找到// 第一個遍歷得到鏈表的長度int size = getLength(head);// 第二次遍歷 size-index位置,就是我們倒數的第k個節點// 先做一個index的校驗if(index<=0 || index>size){return null;}// 定義一個輔助變量HeroNode cur = head.next;for(int i=0;i<size-index;i++){cur = cur.next;}return cur;}/*** 面試題: 獲取單鏈表的節點的個數(如果是帶頭節點的鏈表,不統計頭節點)* @param head 鏈表的頭節點* @return 返回的是鏈表的節點個數 */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;} }// 定義鏈表,管理結點HeroNode class SingleLinkedList{// 先初始化一個頭節點,頭節點不能動private HeroNode head = new HeroNode(0, "", "");public HeroNode getHeroNode(){return head;}// 添加結點到單向鏈表,直接加到最后結點的后面public void add(HeroNode heroNode){// 找到當前鏈表的最后節點,將最后這個節點的next,指向新的節點HeroNode temp = head;while(true){if(temp.next == null){break;}// 如果沒有找到,就將temp后移temp = temp.next;}// 當退出while循環時,temp指向了鏈表的最后一個結點temp.next = heroNode;}// 修改節點的信息,根據no編號來修改,即no編號不能改// 1. 根據newHeroNode的no來修改public void update(HeroNode newHeroNode){// 判斷是否為空if(head.next == null){System.out.println("鏈表為空...");return;}// 找到需要修改的節點,根據no編號// 定義一個輔助變量HeroNode temp = head.next;boolean flag = false; // 表示是否找到改節點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{ // 沒有找到System.out.printf("沒有找到編號%d的節點,不能修改\n", newHeroNode.no);}}// 刪除節點// head不能動, 因此我們需要一個temp輔助節點找到待刪除節點的前一個節點public void del(int no){HeroNode temp = head;boolean flag = false; // 標志是否找到待刪除節點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("要刪除的%d 節點不存在\n", no);}}// 第二種添加英雄的方式,根據排名將英雄插入到指定位置public void addByOrder(HeroNode heroNode){// 因為頭節點不能動,因此我們仍然通過一個輔助指針來幫助找到添加的位置// 因為是單鏈表,因此我們要找到temp是位于添加位置的前一個節點HeroNode temp = head;boolean flag = false;while(true){if(temp.next == null){// 說明temp已經在鏈表的最后break;}if(temp.next.no > heroNode.no){break;}else if(temp.next.no == heroNode.no){flag = true; // 說明編號已經存在break;}temp = temp.next;}// 判斷flag的值if(flag){ // 不能添加,說明編號存在System.out.printf("準備插入的英雄的編號%d已經存在,不能加入\n",heroNode.no);}else{// 插入到鏈表中heroNode.next = temp.next;temp.next = heroNode;}}// 顯示鏈表(遍歷)public void list(){// 判斷鏈表是否為空if(head.next == null){System.out.println("判斷鏈表是否為空...");return;}// 因為頭節點,不能動,因此需要一個輔助變量來遍歷HeroNode temp = head.next;while(true){// 判斷是否到鏈表最后if(temp == null){break;}// 輸出節點信息System.out.println(temp);temp = temp.next; // temp后移,指向下一個節點}} }// 定義HearNode,每個HearNode對象就是一個結點 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 + "]";}}?
總結
以上是生活随笔為你收集整理的数据结构:链表面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端二十九:两个盒子居中的练习
- 下一篇: 剑指offer一:二维数组中的查找