单链表的结构

单链表的存储原理图,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。

代码实现单链表

链表节点的定义

链表是由一个个节点连接形成的,先定义节点类,节点类主要分数据和next指针


public class ListNode {public Object data;public ListNode next = null;ListNode(){data = null;}ListNode(Object data) {this.data = data;}}

import java.util.Stack;public class LinkListDemo {private ListNode head;//头节点private ListNode cur;//临时节点,游标//初始化链表,生成一个无数据的头节点LinkListDemo() {head = new ListNode();}public void addNode(Object data) {ListNode node = new ListNode(data);if (head == null) {head = node;} else {cur = head;while (cur.next != null) {cur = cur.next;}cur.next = node;}}public int getListLength() {int len = 0;cur = head;while (cur.next != null) {cur = cur.next;len++;}return len;}/*** 增加节点到指定的位置** @param index* @param data* @throws Exception*/public void addNodeByIndex(int index, Object data) throws Exception {if (index < 1 || index > getListLength() + 1) {throw new Exception("插入位置不合法");}int i = 1;ListNode node = new ListNode(data);cur = head;while (cur.next != null) {if (index == i) {node.next = cur.next;cur.next = node;return;}i++;cur = cur.next;}}/*** 删除链表指定位置的节点** @param index* @throws Exception*/public void deleteByIndex(int index) throws Exception {if (index < 1 || index > getListLength() + 1) {throw new Exception("删除位置不合法");}int i = 1;cur = head;while (cur.next != null) {if (index == i) {cur.next = cur.next.next;return;}i++;cur = cur.next;}}/*** 从头到尾打印链表的数据*/public void printListFromHead() {cur = head;while (cur.next != null) {System.out.print("{" + cur.next.data + "} ");cur = cur.next;}System.out.println();}/*** 从尾到头打印链表的数据* 利用栈的后进先出的存储特点来实现*/public void printListFromTail() {Stack<ListNode> stack = new Stack<>();cur = head;while (cur.next != null) {stack.push(cur.next);cur = cur.next;}while (!stack.empty()) {System.out.print("{" + stack.pop().data + "} ");}System.out.println();}/*** 反转链表* 1 → 2 → 3 → Ø,改成 Ø ← 1 ← 2 ← 3* 记录下一位,保留上一位元素* 返回头结点*/public ListNode reverseList() {ListNode prev = null;cur = head;while (cur != null) {//更改引用之前,需要另一个指针来存储下一个节点ListNode temp = cur.next;cur.next = prev;prev = cur;//节点没有引用其上一个节点,因此先存储当前元素cur = temp;}return prev;}/*** 递归反转链表* 边界,递归入口,递归出口,返回新的头引用* @param head* @return*/public ListNode recursiveList(ListNode head) {if (head == null || head.next == null) {return head;}ListNode p = recursiveList(head.next);head.next.next = head;head.next = null;return p;}/*** 判断是否有环。快慢指针 或者 用哈希表结构判断元素是否被访问过(去重)* @param head* @return*/public boolean hasCycle(ListNode head) {if (head == null || head.next == null || head.next.next == null) {return false;}ListNode stepOne = head.next;ListNode stepTwo = head.next;while (stepOne != null && stepTwo != null) {stepTwo = stepTwo.next;if (stepTwo == null) {return false;}if (stepOne == stepTwo) {return true;}stepOne = stepOne.next;stepTwo = stepTwo.next;}return false;}/*** 通用,可以打印无头链表* @param p*/public void printList(ListNode p) {cur = p;while (cur != null) {System.out.print("{" + cur.data + "} ");cur = cur.next;}System.out.println();}public static void main(String[] args) throws Exception {LinkListDemo list = new LinkListDemo();list.addNode(1);list.addNode(2);list.addNode(3);list.addNode(4);list.printListFromHead();
//        list.addNodeByIndex(2, 3.3);
//        list.printListFromHead();
//        list.printListFromTail();ListNode p = list.reverseList();list.printList(p);//ListNode p = list.recursiveList(list.head);//list.printList(p);}}

Java单链表基本操作相关推荐

  1. java单链表基本操作 一,Java_实现单链表-基本操作

    1 packageofficeCoding;2 3 importjava.util.ArrayList;4 importjava.util.Stack;5 6 /** 7 * 从尾到头遍历链表 输入一 ...

  2. Java单链表反转 详细过程

    Java单链表反转 Java实现单链表翻转     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51119499 (一) ...

  3. Java单链表、双端链表、有序链表实现

    Java单链表.双端链表.有序链表实现 原创 2014年03月31日 23:45:35 标签: Java / 单链表 / 双端链表 / 有序链表 65040 单链表: insertFirst:在表头插 ...

  4. 7-4 单链表基本操作

    7-4 单链表基本操作 请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整 ...

  5. 237删除链表中的节点(单链表基本操作)

    1.题目描述 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 说明: 链表至少包含两个节点. 链表中所有节点的值都是唯一的. 给定的节点为非末尾节点并且一定 ...

  6. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  7. 数据结构-单链表基本操作-C语言代码

    单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...

  8. 【数据结构|链表】单链表基本操作

    文章目录 一.链表 二.链表分类 三.单链表基本操作   3.1 单链表存储结构Init   3.2 遍历链表visitlist函数   3.3 求表长length   3.4 查找listfind ...

  9. 单链表基本操作的实现

    单链表基本操作的实现 [PS]: 由于笔者的能力水平有限,如果遇到相关错误或者存在歧义的地方,欢迎在下方评论区留言联系笔者,如果你觉得这篇文章对你有帮助,那么不妨动动你的小手点赞收藏转发,让更多的人看 ...

  10. 【数据结构-C】单链表基本操作及图解分析

    目录 单链表介绍​ 单链表基本操作及图解分析 1.创建一个新结点 2.头插法向单链表中插入结点​ 3. 尾插法向单链表中插入结点​ 4.头删法删除单链表结点​ 5.尾删法删除单链表结点​ 6.返回单链 ...

最新文章

  1. 优化汽车仪表板以实现高效渲染
  2. 160个Crackme020之无OD爆破
  3. 用tp5写了一个简单的登录验证
  4. UML是什么?UML常用图以及建模工具有哪些?
  5. 设计模式-创建型模式-模板方法
  6. UE3 贴图支持及设置
  7. 此计算机上缺少vc2005_sp1_with_atl_fix_redist
  8. java毕业设计对外汉语教学辅助平台Mybatis+系统+数据库+调试部署
  9. mysql轮播图表设计_制作一个简单的轮播图
  10. PQ分区出错用Ghost来进行补救
  11. BZOJ 5109 大吉大利,晚上吃鸡 Code+
  12. xp用户未授予用户在此计算机,未授予用户在此计算机上的请求登录类型的解决方法 win7XP共享打印机完美解决教程...
  13. 开通阿里云视频点播服务
  14. 懒人起名神器,百度翻译内容改为驼峰格式
  15. Morsel-Driven Parallelism: 一种NUMA感知的并行Query Execution框架
  16. 最详细G1垃圾回收器日志解读
  17. $ is not a function
  18. b+和b-数比较和优势
  19. linux基础09——nl
  20. 秋季出生的宝宝这样起名,全班同学都羡慕。

热门文章

  1. linux ftdi 虚拟,linux – 由FTDI USB串行转换器创建的监控(嗅探)/ dev / ttyUSB0
  2. 安装应用需要打开未知来源权限_华为盒子安装不了第三方软件?不存在的,简单几步即可搞定...
  3. C程序设计--指针(用 “ 函数 ” 对 “ 多维数组 ” 进行操作)
  4. android快速查询,android常用adb快捷命令一览表
  5. python编写贪吃蛇_一步一个脚印教你用python开发一个贪吃蛇小游戏!
  6. windows php7怎么配置,PHP7在windows7中的环境配置详解
  7. 二叉树查找结点及父结点_【剑指offer】57 二叉树的下一个结点
  8. mysql表设计原则_MYSQL数据库设计规范与原则
  9. python代码怎么样_python代码怎样清屏
  10. 翻译:iOS上的MVVM + RxSwift架构对比 MVC,MVVM,MVP和VIPER