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 + "]";}}

数据结构:链表面试题相关推荐

  1. Java数据结构链表面试题 作者:哇塞大嘴好帥(哇塞大嘴好帅) --持续更新

    作者:哇塞大嘴好帥(哇塞大嘴好帅) Java数据结构链表面试题 4.1.查询链表有效数据个数 //判断有效数据个数 public int validDate(){//创建临时变量NodeDate no ...

  2. 数据结构——链表面试题

    #pragma once#include"slist.h" //从头到尾打印单链表 void print_single(SListNode *pFirst) {assert(pFi ...

  3. 输入一个数寻找丑数C语言,数据结构与算法试题80道.doc

    数据结构与算法试题80道 由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是前80题第一次集体亮相. 此些题,已有上万人,看到或见识到, ...

  4. 你必须要知道的JavaScript数据结构与面试题解答

    英文原文 | https://dev.to/educative/7-javascript-data-structures-you-must-know-4k0m 原文作者 | Ryan Thelin和A ...

  5. java数据结构-链表详解

    文章目录 1.数据结构-链表详解 1.1单链表 1.1.1单链表节点的尾部添加 1.1.2单链表节点的自动排序添加 1.1.3单链表节点的修改 1.1.4单链表节点的删除 1.2单链表面试题 1.2. ...

  6. 数据结构期末考试试题总结

    数据结构期末考试试题总结 文章目录 数据结构期末考试试题总结 第1章 第一单元课程介绍; 数据结构第1~2章 第2章 第二单元第3章栈和队列 1.0中缀表达式为( A + B ) × C – D / ...

  7. 数据结构 线性表试题

    数据结构 线性表试题 1. 数组A[1-5,1-6]每个元素占5个单元,将其按行优先次序存储在起始地址为1000的连续的内存单元中,则元素A[5,5]的地址为: A.1120 B.1125 C.114 ...

  8. 《数据结构 》排序试题附答案

    <数据结构 >排序试题附答案 一.选择题 1.某内排序方法的稳定性是指(    ). A.该排序算法不允许有相同的关键字记录      B.该排序算法允许有相同的关键字记录 C.平均时间为 ...

  9. 初学数据结构--链表

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在这一章,我将介绍另外一种非常重要的线性数据结构--链表.在之前介绍的动态数组,栈和队列这三种数据结构,底层其实依托于静 ...

最新文章

  1. DCN-s4600 ssh服务登录配置:
  2. MySQL触发器的使用规则
  3. 大数据是怎么知道你去过新发地的?
  4. 5G VoNR — Overview
  5. 插入排序(c++实现)
  6. 注定一爆就完的ZAO ,为什么只是一剂社交毒药?
  7. 《数字图像处理》 笔记
  8. python matplotlab.pyplot.axis()函数的用法
  9. 反模式设计_设计模式:模式或反模式,这就是问题
  10. Dev C++详细配置
  11. 目标检测二十年间的那些事儿——从传统方法到深度学习
  12. np读取csv文件_pythonpandas读写csv数据
  13. java程序效率_优化JAVA程序的执行效率和性能
  14. C#之Bcd码时间转成ToDateTime
  15. 在css中使用hover来控制其他元素的样式,该两个元素必须是父子元素
  16. java多线程框架 netty,JavaSocket编程之Netty框架线程模型
  17. Scade Suite开发 ARINC 661 (2)Scade Suite基本操作
  18. python ccf题解 201903-2 二十四点
  19. c++编译提示:系统找不到指定路径
  20. 高德离线地图瓦片坐标偏移纠偏

热门文章

  1. git push 操作代码回退
  2. 第三周总结CoreIDRAW
  3. Quartz Properties 文件
  4. Python: generator, yield, yield from 详解
  5. 操作笔记:tomcat在正式环境的常见问题和idea的远程调试
  6. 谈谈Team Foundation Server Proxy
  7. 算法分析之-主方法分析递归式
  8. 实时计算Flink——产品安全
  9. 在CNN上增加一层CAM告诉你CNN到底关注什么
  10. 大战设计模式【16】—— 桥接模式