单向链表的简单Java实现-sunziren

  写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起。



  最近面试的过程中,发现有的公司的面试题考到了链表的逆序,这一块我正好不是特别清楚。于是打算把链表这一块好好的学习学习。在网上搜寻了众多的资料以后,了解到链表的核心是节点与节点之间的互相链接。

  于是自己也写了一个单向链表的类,里面包括input插入方法,inputById按指定下标插入方法,deleteAll删除所有节点方法,deleteById按指定下标删除结点方法,showAll控制台查看所有元素方法,reverse反转当前链表方法,length获取当前链表长度方法,等基本方法。

  需要说明的是,这个类还有很多不足之处,它还有很多需要改进的地方。但是基本原理和单向链表是相同的,仅供参考。

  1 package demo_4;
  2
  3 import java.util.Stack;
  4
  5 public class MyList<Re_Helix> {
  6     //节点内部类;
  7     private class Node{
  8         private Re_Helix data;            //数据;
  9         private Node next = null;            //下个节点的引用;
 10
 11         public Node() {         //节点的无参构造;
 12             super();
 13         }
 14
 15         public Node(Re_Helix data) {         //节点的有参构造;
 16             super();
 17             this.data = data;
 18         }
 19     }
 20
 21     private Node head;            //头部节点;
 22     private Node end;            //尾部节点;
 23     private Node point;            //临时节点;
 24     private int length;            //长度属性;
 25
 26     public MyList() {            //链表的无参构造;
 27         head = new Node();
 28         end = head;
 29         length = 0;
 30     }
 31
 32     public void input(Re_Helix data) {            //给链表插入新值;
 33         point = new Node(data);
 34         if(length==0) {
 35             end.data = point.data;
 36         }else {
 37             end.next = point;
 38             end = point;
 39         }
 40         length++;
 41     }
 42
 43     public void inputById(int target,Re_Helix data) {            //在指定下标的位置插入新值,如果两端超出范围,则分别按照head和end处理;
 44         Node temp = new Node(data);
 45         if(target>=length) {
 46             end.next = temp;
 47             end = temp;
 48         }else if(target<=0) {
 49             temp.next = head;
 50             head = temp;
 51         }else {
 52             temp.next = packPoint(target);
 53             packPoint(target-1).next = temp;
 54         }
 55         length++;
 56     }
 57
 58     public int length() {            //返回链表的长度;
 59         return length;
 60     }
 61
 62     public Re_Helix getById(int target) {            //输入下标返回值;
 63         return packPoint(target).data;
 64     }
 65
 66     public void showAll() {            //在控制台查看当前链表中的所有数据
 67         point = head;
 68         int i = 0;
 69         while(point!=null) {
 70             System.out.println("第"+(i++)+"个:"+point.data);
 71             point = point.next;
 72         }
 73     }
 74
 75     public void reverse() {            //将链表反转;
 76         Stack<Node> s1 = new Stack<Node>();            //利用队列的先进先出的特性;
 77         point = head;
 78         while(point!=null) {
 79             s1.push(point);
 80             point = point.next;
 81         }
 82         head = s1.pop();
 83         point = head;
 84         while(!s1.isEmpty()) {
 85             point.next = s1.pop();
 86             point = point.next;
 87         }
 88         end = point;
 89         end.next = null;  //要将逆序后的end位置节点的next置空,不然会造成最后两位的循环;
 90     }
 91
 92     public void deleteById(int target) {            //输入下标删除值
 93         if(target>0) {
 94             packPoint(target-1).next = packPoint(target).next;
 95         }else {
 96             head = head.next;
 97         }
 98         length--;
 99     }
100
101     public void deleteAll() {            //清空链表;
102         length = 0;
103         head.data = null;
104         head.next = null;
105         point = null;
106         end = head;
107         System.gc();
108     }
109
110     public boolean editById(int target,Re_Helix data) {            //修改传入下标位置的值;
111         if(target<0 || target>length) {
112             return false;
113         }else {
114             packPoint(target).data = data;
115             return true;
116         }
117     }
118
119     private Node packPoint(int target) {            //内部方法,将指针指向指定下标的节点;
120         if(target<=0) {
121             point = head;
122         }else if(target>=length) {
123             point = end;
124         }else {
125             int i = 0;
126             point = head;
127             while(i++!=target) {
128                 point = point.next;
129             }
130         }
131         return point;
132     }
133 }

  多有不足,欢迎评论区批评指正。

原文地址:https://www.cnblogs.com/sunziren/p/10254481.html

时间: 2024-07-30 03:26:01

单向链表的简单Java实现-sunziren的相关文章

双向链表的简单Java实现-sunziren

写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的"阅读更多"按钮,惹不起我躲得起. 在上次分享完单向链表的简单编写后,索性对于双向链表进行了一定的了解,在上次的基础上进行了一定程度的改进,做了一个非循环的双向链表. 双向链表的特点在于每个节点不仅知道自己的下属节点而且还知道自己的父节点.在双向链表的逆序方法中,我使用的队列来支持这个操作,利用了队列的先进先出的特点. 1 package demo_4

数据结构和算法--链表一之单向链表的简单实现

链表在我们java中也是一种基础的数据结构,可以理解成是一种和数组同级的数组结构,正如我们所知,在我们使用这集合ArrayList和LinkedList的时候,总会学习底层数组实现的ArrayList和双向链表实现的LinkedList的区别.在这里,我们将要讲说的是单向链表的简单实现,让我们体会一下链表在实现增删改查的时候是怎么样的一个操作,在和前边涉及到的数组的增删改查进行对比,得到我们学习的结论,数组的增删效率低于链表结构,查改效率高于链表结构! 什么叫做单向链表,我们可以理解为一个一个节

单向链表的简单实现

一.概念 单向链表是一种简单数据结构,由多个节点构成,每个节点里面保存了节点中的数据和指向下一个节点的引用,链表的第一个节点被称为根节点(root)或头节点(head) 二.使用Java实现基本结构 需要一个Node类和一个Link类,Node类中存放Node中保存的数据和下一个Node的指向,Link类中保存root节点. 1 class Node { 2 private String data; 3 private Node next; 4 public Node(String data)

单向链表的简单使用

一.单向链表的概念 单向链表是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始.链表是使用指针进行构造的列表,并且是由一个个结点组装起来的,因此又称为结点列表.其中每个结点都有指针成员变量指向列表中的下一个结点,head指针指向第一个结点称为表头,而终止于最后一个指向nuLL的指针. 结点的数据结构 [objc] view plain copy print? typedef struct _LINK_NODE { int data; struct _LINK_NO

java 单向链表

简单单向链表 [java] view plaincopyprint? class Node{ private String data; //存储当前节点内容 private Node   next=null; //存储下一下节点 public Node(String data){ this.setDate(data); } public void setDate(String data){ this.data = data; } public void setNext(Node next){ t

单向链表的Java实现

一.链表的简单实现 1 package test01; 2 3 /* 4 * 单向链表的简单实现 5 * */ 6 7 class Node{ 8 private String data; 9 private Node next; 10 public Node(String data){ 11 this.data = data; 12 } 13 public String getData() { 14 return data; 15 } 16 public void setData(String

java版的单向链表的逆序输出

将单向链表逆序输出,方法有三种: a.遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组(最简单的做法) b.使用栈来逆序输出 c.直接将链表逆序然后输出(本文采用的方法) 先介绍算法: 1). 若链表为空或只有一个元素,则直接返回: 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继: 3). 重复2),直到q为空 4). 调整链表头和链表尾 示例:以逆序A->B->C->D为例,图示如下 package com.moluo.shujujiegou;

线性表的Java实现--链式存储(单向链表)

线性表的Java实现--链式存储(单向链表) 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在插入.删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢. 使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点,链表结构可以充分利用内存空间,实现灵活的内存动态管理.但是链式存储失去了数组随机存取的特点,同时增加了节点的指针域,空

【转】单向链表(单链表)的Java实现

最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究.但链表这个东西我 还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧. 但是我还是抽了一个晚上加半天的时间看了一下单向链表.并且使用Java试着写了一个实例出来.没有接触过链表的朋友可以作为参考,希望大家多提