目录

方法一

方法二

问题一:求单链表中有效节点的个数

问题二:查找单链表中的倒数第k个结点

问题三:单链表的反转

问题三:从尾到头打印单链表 【方式1:反向遍历 。 方式2:Stack栈】

问题四:合并两个有序的单链表,合并之后的链表依然有序


链表是有序的列表,但是它在内存中是存储如下

小结:

1) 链表是以节点的方式来存储 , 是链式存储
2) 每个节点包含 data 域, next 域:指向下一个节点 .
3) 如图:发现链表的 各个节点不一定是连续存储 .
4) 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定

单链表(带头结点) 逻辑结构示意图如下

方法一

从最后一个节点尾部插入,不按排名no的顺序插入

添加(创建)

1. 先创建一个head 头节点, 作用就是表示单链表的头

2. 后面我们每添加一个节点,就直接加入到链表的最后

遍历:

1.  通过一个辅助变量遍历,帮助遍历整个链表

public class List {public static void main(String[] args) {//创建节点Node node1 = new Node(1, "口红", "纪梵希");Node node2 = new Node(2, "粉底液", "圣罗兰");Node node3 = new Node(3, "香水", "香奈儿");//创建链表SingleLinkedList singleLinkedList = new SingleLinkedList();singleLinkedList.add(node1);singleLinkedList.add(node2);singleLinkedList.add(node3);singleLinkedList.list();}
}
class SingleLinkedList{//头节点,不存放具体数据private Node head = new Node(0,"","");//不考虑排序public void add(Node node){Node temp = head;//找到链表的最后一个节点while (true){if(temp.next==null) break;temp = temp.next;}temp.next=node;}public void list(){if(head.next==null){System.out.println("链表为空");return;}Node temp = head.next;while (true){if(temp==null) break;System.out.println(temp);temp=temp.next;}}
}
class Node{public int no;public String name;public String nickname;public Node next;public Node(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}@Overridepublic String toString() {return "Node{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\'' +'}';}
}

方法二

需要按照编号的顺序添加

1. 首先找到新添加的节点的位置, 是通过辅助变量(指针), 通过遍历来搞定

2. 新的节点.next = temp.next

3. 将temp.next = 新的节点

public class List {public static void main(String[] args) {//创建节点Node node1 = new Node(1, "口红", "纪梵希");Node node2 = new Node(2, "粉底液", "圣罗兰");Node node3 = new Node(3, "香水", "香奈儿");Node node4 = new Node(4, "眉笔", "植村秀");//创建链表SingleLinkedList singleLinkedList = new SingleLinkedList();
//        singleLinkedList.add(node1);
//        singleLinkedList.add(node2);
//        singleLinkedList.add(node3);singleLinkedList.addByOrder(node4);singleLinkedList.addByOrder(node2);singleLinkedList.addByOrder(node3);singleLinkedList.addByOrder(node1);// singleLinkedList.list();//修改测试Node newNode = new Node(2, "鼻影", "too cool for school");singleLinkedList.update(newNode);//   singleLinkedList.list();//删除测试singleLinkedList.delete(3);singleLinkedList.list();}
}
class SingleLinkedList{//头节点,不存放具体数据private Node head = new Node(0,"","");//不考虑排序public void add(Node node){Node temp = head;//找到链表的最后一个节点while (true){if(temp.next==null) break;temp = temp.next;}temp.next=node;}//考虑编号排序public void addByOrder(Node node){Node temp = head;while (true){if(temp.next==null||temp.next.no>node.no){node.next=temp.next;temp.next=node;return;}else if(temp.next.no==node.no){System.out.println("编号"+node.no+"已经存在,无法添加");return;}temp=temp.next;}}//删除节点public void delete(int no){if(head.next==null){System.out.println("链表为空");return;}Node temp = head;while(true){if(temp.next==null){System.out.println("没有找到该节点");return;}if(temp.next.no==no){temp.next=temp.next.next;return;}temp = temp.next;}}//根据node的no来修改nodepublic void update(Node newNode){if(head.next==null){System.out.println("链表为空");return;}Node temp = head;while(true){if(temp.next==null){System.out.println("链表中没有该节点,添加为新节点");addByOrder(newNode);return;}if(temp.next.no== newNode.no){newNode.next = temp.next.next;temp.next=newNode;return;}temp=temp.next;}}public void list(){if(head.next==null){System.out.println("链表为空");return;}Node temp = head.next;while (true){if(temp==null) break;System.out.println(temp);temp=temp.next;}}
}
class Node{public int no;public String name;public String nickname;public Node next;public Node(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}@Overridepublic String toString() {return "Node{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\'' +'}';}
}

问题一:求单链表中有效节点的个数

public int getLength(){int length = 0;Node cur = head.next;while(cur!=null){length++;cur=cur.next;}return length;}

问题二:查找单链表中的倒数第k个结点

//查找单链表中的倒数第k个结点public Node Backward_check(int index){if(head.next==null) return null;int size =getLength();int num = size-index+1;if(num<=0||num>size) return null;Node cur = head;for(int i = 1;i<=num;i++){cur=cur.next;}return cur;}

问题三:单链表的反转

//单链表的反转public SingleLinkedList reverser(){SingleLinkedList reverser = new SingleLinkedList();Node cur = head;while(true){if(cur.next==null) return reverser;else {Node temp =cur.next;cur.next=cur.next.next;temp.next=reverser.head.next;reverser.head.next=temp;}}}

问题三:从尾到头打印单链表 【方式1:反向遍历 。 方式2:Stack栈】

//倒序打印链表public void print_backByReverser(){SingleLinkedList reverser = reverser();reverser.list();}public void print_backByStack(){Stack<Node> stack = new Stack<Node>();Node cur = head;while(cur.next!=null){stack.push(cur.next);cur = cur.next;}while(stack.size()>0){System.out.println(stack.pop());}}

问题四:合并两个有序的单链表,合并之后的链表依然有序

//合并两个有序的单链表,合并之后的链表依然有序public void merge(SingleLinkedList list){Node cur = list.head;while(cur.next!=null){Node temp =cur.next;cur.next=cur.next.next;temp.next=null;addByOrder(temp);}}

Java数据结构——链表相关推荐

  1. 猴子选大王 java_基于java数据结构链表写的猴子选大王

    [实例简介] 基于java数据结构链表写的猴子选大王,其实就是一个约瑟夫环问题,采用java数据结构链表写的.有点小问题.当输入一只猴子,报数为1时删除会出错.没有实现动态显示猴子的添加和删除. [实 ...

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

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

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

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

  4. Java数据结构--链表

    public interface Predecessor<E> {//定义接口 用于实现多态public ListNode<E> getNext(); public void ...

  5. java数据结构 -链表 -获取有效节点个数,单链表中倒数k个节点

    // 1.获取到单链表的节点的个数(如果有头结点,不统计头结点)public static int getLength(HeroNode head){if (head.next == null){re ...

  6. 【Java数据结构[链表--单向链表]】

    单向链表 链表是以节点的方式来存储的,是链式存储 每个节点包含一个数据域用来保存当前节点的数据,一个next域用于指向下一个节点 单链表结构示意图: 单链表内存示意图: 代码实现: //链表 clas ...

  7. Java数据结构 -- 链表

    生活中的链表 链表其实是一个一环扣一环的东西,最简单明了的就是我们的链子了,它就是一个一环扣一环的东西 链表介绍 链表在内存中的图解可以用下图来表示 链表是以节点的方式存储,是一个链式存储. 每个节点 ...

  8. Java数据结构和算法(七)——链表

    前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷.在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除效率都很低,并且数组在创建后,其大小是固定了,设置的过大会造 ...

  9. java双链表基本方法_Java数据结构之双端链表原理与实现方法

    本文实例讲述了Java数据结构之双端链表原理与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.什么时双端链表: 链表中保持这对最后一个连点引用的链表 2.从头部插入 要对链表进行判断,如果 ...

最新文章

  1. Twisted入门教程(12)
  2. B站王道论坛计算机网络,成都理工大学计算机网络考研学长经验分享
  3. 安装nexus时遇到的一个问题
  4. [php]apache虚拟主机配置
  5. 骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站
  6. java面向对象封装之有参无返与有参有返
  7. 10年老司机倾囊相授,贴片晶振的PCB layout需要注意哪些?
  8. 微信 java抓取_【java】微信文章抓取
  9. linux下samba服务器无法访问,解决windows7客户端无法访问Samba服务器的故障
  10. 七大步教你征服丈母娘
  11. TM1637 MSP430 单片机 数码管 程序 驱动 G2553
  12. 全景图下载——chrome插件Pano fetch
  13. 智能驾驶之技术概念综述
  14. 用户数据治理和无服务器流式处理
  15. DCT-Net 水记(用于 人脸风格化 的 小样本 图像翻译,无需反演,无需构造配对图片)
  16. PAT (Advanced Level) Practice 1165 Block Reversing
  17. 一个针对现代办公文档中错别字的解决方案:JcJc 错别字在线检查
  18. 推免资料(个人自述,简历、推荐信模板等)
  19. 创远家居基于江湖家居装修门户系统源码
  20. 中国有嘻哈——押韵机器人

热门文章

  1. 那些你不知道的MapStruct用法——Mapstruct自定义映射
  2. Java面试,如何设计一个秒杀系统
  3. vue中后台管理中使用水印
  4. 疯狂大厨 android,疯狂大厨玩转餐厅安卓版
  5. Cisco(1)——ping通两台路由器
  6. 包邮到家,送一台新款英特尔笔记本电脑!
  7. 传奇3账号卡正在连接服务器,传奇来了出现第三方登陆失败怎么办 解决方案一览...
  8. pthread_create函数
  9. 《黑白配》算法考题:黑白点的最大匹配数目(JavaScript解答)
  10. 安全用电守护卫士,同为(TOWE)带漏电保护功能桌面PDU插座