文章目录

  • 一、单链表
      • 前期准备:
    • 1、添加结点
    • 2、遍历链表
    • 3、修改结点
    • 4、删除结点
    • 5、获取长度
    • 6、获取链表的倒数第N个结点
    • 7、反转链表
    • 8、反转打印链表
    • 9、按照编号有序添加结点
    • 10、在指定位置插入结点
  • 二、双链表
  • 双向链表介绍
    • 1、添加结点
    • 2、修改结点
    • 3、删除结点
    • 4、遍历结点
    • 完整代码
    • 测试代码

一、单链表

前期准备:

1)创建一个学生结点

public class StudentNode {public int id;public int num;//学号public String name;//姓名public StudentNode next;//保存下一个结点public StudentNode(int id, int num, String name) {this.id = id;this.num = num;this.name = name;}@Overridepublic String toString() {return "StudentNode{" +"num=" + num +", name='" + name + '\'' +'}';}
}

2)创建一个单链表

public class SingleLinkedList {private StudentNode head;/*** init a node of head* 初始化一个头节点*/public SingleLinkedList( ) {head = new StudentNode(0, 0, "");}public StudentNode getHead() {return head;}"""""""""""}

1、添加结点

思路:

1.通过遍历找到指向空的结点(temp.next=null)
2.修改指针的指向,也就是让temp.next=null指向新的结点

看图说话:

代码:

public void add(StudentNode studentNode) {StudentNode temp = head;//while循环用于找到最后一个结点(null)while (true) {if (temp.next == null) {break;} else {temp = temp.next;//移动指针到下一个结点}}//studentNode 为新添加的结点temp.next = studentNode;}

2、遍历链表

思路:

1、获得头结点
2、定义一个变量作为临时变量
3、循环移动指针,知道为null停止

看图说话:

代码:

public void list() {if (head.next == null) {System.out.println("LinkedList is empty!");return;}StudentNode temp = head.next;while (true) {if (temp == null) {break;} else {System.out.println(temp);}temp = temp.next;}}

3、修改结点

代码:

public void update(StudentNode studentNode) {if (head.next == null) {System.out.println("linkedList is empty!");return;}StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == studentNode.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.num = studentNode.num;temp.name = studentNode.name;} else {System.out.println("Can't find :" + studentNode.id + " node!");}}

4、删除结点

思路:

1.找到要删除结点的前一个结点。
2.修改指针的指向,将要修改结点的前一个结点指针指向后一个结点。

看图说话:

代码:

public void remove(int id) {StudentNode temp = head;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id == id) {flag = true;break;}temp = temp.next;}if (flag) {temp.next = temp.next.next;} else {System.out.println("Can't find the node for id!");}}

5、获取长度

思路:

将链表遍历一遍即可。

代码:

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

6、获取链表的倒数第N个结点

思路:

1.有多种方式:比如可以设置快慢指针可一遍就删除倒数第N个结点。
2.

看图说话:
代码:

public StudentNode getLastIndexNode(StudentNode head, int index) {if (head.next == null) {return null;}int size = getLength(head);if (index <= 0 || index > size) {return null;}StudentNode cur = head.next;for (int i = 0; i < size - index; i++) {cur = cur.next;}return cur;}

7、反转链表

代码:

public void reverseList(StudentNode head) {if (head.next == null || head.next.next == null) {return;}StudentNode cur = head.next;StudentNode next = null;StudentNode reverseHead = new StudentNode(0, 0, "");while (cur != null) {next = cur.next;cur.next = reverseHead.next;reverseHead.next = cur;cur = next;}head.next = reverseHead.next;}

8、反转打印链表

代码:

public void reversePrint(StudentNode head) {if (head.next == null) {return;}Stack<StudentNode> stack = new Stack<StudentNode>();StudentNode cur = head.next;while (cur != null) {stack.push(cur);cur = cur.next;}while (stack.size() > 0) {System.out.println(stack.pop());}}

9、按照编号有序添加结点

代码:

public void addByOrder(StudentNode studentNode) {//get a head nodeStudentNode temp = head;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id > studentNode.id) {break;} else if (temp.next.id == studentNode.id) {flag = true;break;}temp = temp.next;}if (flag) {System.out.println(studentNode.id + "  is existed and can't add again!");} else {studentNode.next = temp.next;temp.next = studentNode;}}

10、在指定位置插入结点

二、双链表

双向链表介绍

前期准备:
1)创建一个学生结点

package com.qingfeng.linkedList.doubles;class StudentNode {public int id;//序号public int num;//学号public String name;//姓名public StudentNode next;//保存下一个结点public StudentNode pre;//保存前一个结点public StudentNode(int id, int num, String name) {this.id = id;this.num = num;this.name = name;}@Overridepublic String toString() {return "StudentNode{" +"num=" + num +", name='" + name + '\'' +'}';}
}

2)创建一个双向链表

public class DoubleLinkedList {/*** init a node of head*/private StudentNode head;public DoubleLinkedList( ) {head = new StudentNode(0, 0, "");}public StudentNode getHead() {return head;}--------functions----------
}

1、添加结点

代码:

/*** create node of LinkedList** @param studentNode*/public void add(StudentNode studentNode) {StudentNode temp = head;while (true) {if (temp.next == null) {break;} else {temp = temp.next;}}temp.next = studentNode;/*** 1) temp.next.pre=temp;* 2) studentNode.pre=temp;*/studentNode.pre = temp;}

2、修改结点

代码:

/*** update a node** @param studentNode a student object*/public void update(StudentNode studentNode) {if (head.next == null) {System.out.println("linkedList is empty!");return;}StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == studentNode.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.num = studentNode.num;temp.name = studentNode.name;} else {System.out.println("Can't find :" + studentNode.id + " node!");}}

3、删除结点

代码:

 /*** remove a node by id** @param id*/public void remove(int id) {StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == id) {flag = true;break;}temp = temp.next;}if (flag) {temp.pre.next = temp.next;if (temp.next != null) {temp.next.pre = temp.pre;}} else {System.out.println("Can't find the node for id!");}}

4、遍历结点

代码:

/*** order the list*/public void list() {if (head.next == null) {System.out.println("LinkedList is empty!");return;}StudentNode temp = head.next;while (true) {if (temp == null) {break;} else {System.out.println(temp);}temp = temp.next;}}

完整代码

package com.qingfeng.linkedList.doubles;public class DoubleLinkedList {/*** init a node of head*/private StudentNode head;public DoubleLinkedList( ) {head = new StudentNode(0, 0, "");}public StudentNode getHead() {return head;}/*** create node of LinkedList** @param studentNode*/public void add(StudentNode studentNode) {StudentNode temp = head;while (true) {if (temp.next == null) {break;} else {temp = temp.next;}}temp.next = studentNode;/*** 1) temp.next.pre=temp;* 2) studentNode.pre=temp;*/studentNode.pre = temp;}/*** update a node** @param studentNode a student object*/public void update(StudentNode studentNode) {if (head.next == null) {System.out.println("linkedList is empty!");return;}StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == studentNode.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.num = studentNode.num;temp.name = studentNode.name;} else {System.out.println("Can't find :" + studentNode.id + " node!");}}/*** remove a node by id** @param id*/public void remove(int id) {StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == id) {flag = true;break;}temp = temp.next;}if (flag) {temp.pre.next = temp.next;if (temp.next != null) {temp.next.pre = temp.pre;}} else {System.out.println("Can't find the node for id!");}}/*** order the list*/public void list() {if (head.next == null) {System.out.println("LinkedList is empty!");return;}StudentNode temp = head.next;while (true) {if (temp == null) {break;} else {System.out.println(temp);}temp = temp.next;}}
}

测试代码

代码:

package com.qingfeng.linkedList.doubles;/*** test*/
@SuppressWarnings("all")
public class DoubleLinkedListDemo {public static void main(String[] args) {StudentNode node1 = new StudentNode(1, 2018010210, "liuxin");StudentNode node2 = new StudentNode(2, 2018010211, "yanghai");StudentNode node3 = new StudentNode(3, 2018010212, "huxiaotian");DoubleLinkedList linkedList = new DoubleLinkedList();linkedList.add(node1);linkedList.add(node2);linkedList.add(node3);/*------------------------------------------------------------------------*/System.out.println("-------testList-------");linkedList.list();/*------------------------------------------------------------------------*/System.out.println("-------testAdd-------");StudentNode node4 = new StudentNode(4, 2018010212, "guoyoudao");linkedList.add(node4);linkedList.list();/*------------------------------------------------------------------------*/System.out.println("-------testRemove----");linkedList.remove(3);linkedList.list();/*------------------------------------------------------------------------*/System.out.println("-------testUpdate-----");StudentNode update = new StudentNode(4, 2018010212, "xiaoming");linkedList.update(update);linkedList.list();}
}

运行结果:

-------testList-------
StudentNode{num=2018010210, name='liuxin'}
StudentNode{num=2018010211, name='yanghai'}
StudentNode{num=2018010212, name='huxiaotian'}
-------testAdd-------
StudentNode{num=2018010210, name='liuxin'}
StudentNode{num=2018010211, name='yanghai'}
StudentNode{num=2018010212, name='huxiaotian'}
StudentNode{num=2018010212, name='guoyoudao'}
-------testRemove----
StudentNode{num=2018010210, name='liuxin'}
StudentNode{num=2018010211, name='yanghai'}
StudentNode{num=2018010212, name='guoyoudao'}
-------testUpdate-----
StudentNode{num=2018010210, name='liuxin'}
StudentNode{num=2018010211, name='yanghai'}
StudentNode{num=2018010212, name='xiaoming'}Process finished with exit code 0

【Java】数据结构—— 单链表和双链表相关推荐

  1. java数据结构与算法之双链表设计与实现

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: java数据结 ...

  2. 数据结构一线性表 (顺序表、单链表、双链表)

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 文章目录 1.线性表及其逻辑结构 1.1 线性表的定义 1.2 线性表的抽象数据类型描述 2.线性表的顺序存 ...

  3. 【python】数据结构和算法 + 浅谈单链表与双链表的区别

    有这么一句话说"程序=数据结构+算法",也有人说"如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)". 当然这是笼统的说法,不过也 ...

  4. 数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表

    ​ 线性表是数据结构中比较基础的内容,不过也是入门的所需要客服的第一个难关.因为从这里开始,就需要我们动手编程,这就对很多同学的动手能力提出了挑战.不过这些都是我们需要克服的阵痛,学习新的知识总是痛苦 ...

  5. 数据结构——线性表:顺序表、单链表、双链表(C++)

    内容概要: 1.代码部分: 线性表抽象类 顺序表类 单链表类 双链表类 主函数 2.基本概念及注意事项 代码(测试环境VS2017): //线性表ADT类的定义:ADT_List.htemplate ...

  6. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /*** @Description:在单链表和双链表中删除倒数第K个节点* @Author: lizhouwei* @CreateDate: ...

  7. Go 学习笔记(80)— Go 标准库 container/list(单链表、双链表)

    列表是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系.列表有多种实现方法,如单链表.双链表等. ​ 在 Go 语言中,将列表使用 container/list 包来实现,内部 ...

  8. 设计链表(单链表、双链表)

    707. 设计链表 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表 ...

  9. 线性表的链式存储结构及代码实现(单链表,双链表,循环链表)

      在上一篇博文中介绍了线性表的顺序存储方式,它最大的缺点就是在插入和删除操作时会移动大量的元素,这显然会耗费很多时间.后来人们便想到了用链式存储方式来解决上面这一问题.链式存储线性表时,不需要使用地 ...

  10. python创建双链表_Python双链表原理与实现方法详解

    本文实例讲述了Python双链表原理与实现方法.分享给大家供大家参考,具体如下: Python实现双链表 文章目录 Python实现双链表 单链表与双链表比较 双链表的实现 定义链表节点 初始化双链表 ...

最新文章

  1. C#对图片文件的压缩、裁剪操作初探
  2. Linux:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限
  3. C# DataTable笔记
  4. Java 设计模式(3)单例模式
  5. 完整的可按年份和月份查询数据并显示
  6. linux指令 sed,Linux命令sed
  7. java c 转换_java和c通信相关的数据类型转换
  8. 关于angular开发中报错Cannot find module ‘webpack/lib/node/NodeTemplatePlugin‘问题的解决办法若干
  9. 测试对等网络的连通性
  10. 转-ios设备唯一标识获取策略
  11. Go接口(Interface)的使用方法
  12. java调用win32_java调用win32api操作windows窗口
  13. java开发面试项目经验
  14. QTabWidget 删除tab
  15. 怎么用计算机弹出soldout,关于sellout和soldout。
  16. 【毕业论文写作】毕业论文任务书怎么写?
  17. Android Studio配置优化最全详解
  18. (大白话版)子网划分、进制换算
  19. 计算机专业大学生应该在大学四年踏实学哪些东西?
  20. 远控软件GHOST源码免杀

热门文章

  1. flink的watermark参考配置
  2. c++ map 函数
  3. 2017年回顾及总结
  4. 深度解读「无影云电脑远程办公解决方案」
  5. Kettle on MaxCompute使用指南
  6. 阿里巴巴HRSSC:用宜搭实现业务管理模式创新
  7. 苹果:iOS 比 Android 更安全!
  8. 中国电子云发布专属云CECSTACK 以全栈信创赋能千行百业
  9. MongoDB 入门,我是花了心思的
  10. 云+X案例展 | 传播类:k3s基于逾百台工控机的应用实践