Java数据结构——链表
目录
方法一
方法二
问题一:求单链表中有效节点的个数
问题二:查找单链表中的倒数第k个结点
问题三:单链表的反转
问题三:从尾到头打印单链表 【方式1:反向遍历 。 方式2:Stack栈】
问题四:合并两个有序的单链表,合并之后的链表依然有序
链表是有序的列表,但是它在内存中是存储如下
小结:
单链表(带头结点) 逻辑结构示意图如下
方法一
从最后一个节点尾部插入,不按排名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数据结构——链表相关推荐
- 猴子选大王 java_基于java数据结构链表写的猴子选大王
[实例简介] 基于java数据结构链表写的猴子选大王,其实就是一个约瑟夫环问题,采用java数据结构链表写的.有点小问题.当输入一只猴子,报数为1时删除会出错.没有实现动态显示猴子的添加和删除. [实 ...
- Java数据结构链表面试题 作者:哇塞大嘴好帥(哇塞大嘴好帅) --持续更新
作者:哇塞大嘴好帥(哇塞大嘴好帅) Java数据结构链表面试题 4.1.查询链表有效数据个数 //判断有效数据个数 public int validDate(){//创建临时变量NodeDate no ...
- java数据结构-链表详解
文章目录 1.数据结构-链表详解 1.1单链表 1.1.1单链表节点的尾部添加 1.1.2单链表节点的自动排序添加 1.1.3单链表节点的修改 1.1.4单链表节点的删除 1.2单链表面试题 1.2. ...
- Java数据结构--链表
public interface Predecessor<E> {//定义接口 用于实现多态public ListNode<E> getNext(); public void ...
- java数据结构 -链表 -获取有效节点个数,单链表中倒数k个节点
// 1.获取到单链表的节点的个数(如果有头结点,不统计头结点)public static int getLength(HeroNode head){if (head.next == null){re ...
- 【Java数据结构[链表--单向链表]】
单向链表 链表是以节点的方式来存储的,是链式存储 每个节点包含一个数据域用来保存当前节点的数据,一个next域用于指向下一个节点 单链表结构示意图: 单链表内存示意图: 代码实现: //链表 clas ...
- Java数据结构 -- 链表
生活中的链表 链表其实是一个一环扣一环的东西,最简单明了的就是我们的链子了,它就是一个一环扣一环的东西 链表介绍 链表在内存中的图解可以用下图来表示 链表是以节点的方式存储,是一个链式存储. 每个节点 ...
- Java数据结构和算法(七)——链表
前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷.在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除效率都很低,并且数组在创建后,其大小是固定了,设置的过大会造 ...
- java双链表基本方法_Java数据结构之双端链表原理与实现方法
本文实例讲述了Java数据结构之双端链表原理与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.什么时双端链表: 链表中保持这对最后一个连点引用的链表 2.从头部插入 要对链表进行判断,如果 ...
最新文章
- Twisted入门教程(12)
- B站王道论坛计算机网络,成都理工大学计算机网络考研学长经验分享
- 安装nexus时遇到的一个问题
- [php]apache虚拟主机配置
- 骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站
- java面向对象封装之有参无返与有参有返
- 10年老司机倾囊相授,贴片晶振的PCB layout需要注意哪些?
- 微信 java抓取_【java】微信文章抓取
- linux下samba服务器无法访问,解决windows7客户端无法访问Samba服务器的故障
- 七大步教你征服丈母娘
- TM1637 MSP430 单片机 数码管 程序 驱动 G2553
- 全景图下载——chrome插件Pano fetch
- 智能驾驶之技术概念综述
- 用户数据治理和无服务器流式处理
- DCT-Net 水记(用于 人脸风格化 的 小样本 图像翻译,无需反演,无需构造配对图片)
- PAT (Advanced Level) Practice 1165 Block Reversing
- 一个针对现代办公文档中错别字的解决方案:JcJc 错别字在线检查
- 推免资料(个人自述,简历、推荐信模板等)
- 创远家居基于江湖家居装修门户系统源码
- 中国有嘻哈——押韵机器人