单向链表的简单实现

一、概念

  单向链表是一种简单数据结构,由多个节点构成,每个节点里面保存了节点中的数据和指向下一个节点的引用,链表的第一个节点被称为根节点(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) {
 5         this.data = data;
 6     }
 7     public String getData(){
 8         return data;
 9     }
10     public void setNext(Node node) {
11         this.next = node;
12     }
13     public Node getNext() {
14         return next;
15     }
16     public void addNode(Node newNode){    //增加节点
17         if(this.next == null){
18             this.next = newNode;
19         }else{
20             //当前节点不为空,则用当前节点的下一个去继续保存
21             this.next.addNode(newNode);
22         }
23     }
24     public void printNode(){
25         System.out.println(this.data);
26         if(this.next != null)
27             this.next.printNode();
28     }
29 }
30 class List {
31     private Node root;
32     public void add(String data){    //增加数据
33         Node newNode = new Node(data);
34         if( this.root == null){
35             this.root = newNode;
36         }else{
37             this.root.addNode(newNode);
38         }
39     }
40 }

  以上代码实现了链表的基本结构,和Link中的add()(以String对象为例子)方法,但是上面代码中Node类可以直接被外部访问,我们希望外部对链表的操作都通过Link类进行,Node类对外部隐藏,可以使用内部类来实现。

  1 class Link{
  2     private class Node{
  3         private String data;        //节点中要保存的数据
  4         private Node next;            //设置指向下一个节点
  5         public Node(String data){    //构造方法保存数据
  6             this.data = data;
  7         }
  8         public void addNode(Node newNode){        //将新节点添加到已有节点后
  9             if(this.next == null){                //判断当前节点是否为最后一个节点
 10                 this.next = newNode;            //如果是最后一个节点,则用当前节点指向新节点
 11             }else{
 12                 this.next.addNode(newNode);        //否则向后继续保存
 13             }
 14         }
 15         public boolean containsNode(String data){    //查询节点
 16             if(data.equals(this.data)){                //找到内容,返回true
 17                 return true;
 18             }else {
 19                 if (this.next != null){                //存在后续节点,继续 查找
 20                     this.next.containsNode(data);
 21                 }else{
 22                     return false;                    //不存在后续节点,没找到
 23                 }
 24             }
 25                 return false;
 26         }
 27         public String getNode(int index){        //根据索引查询节点
 28             //将节点编号与索引进行比较,相等则返回当前节点中的数据,不相等则找下一个编号
 29             if(Link.this.foot++ == index){
 30                 return this.data;
 31             }else{
 32                 return this.next.getNode(index);
 33             }
 34         }
 35         public void setNode(int index , String data){        //根据索引修改Node的内容
 36             if(Link.this.foot ++ == index){                    //找到对象Node
 37                 this.data = data;            //修改data的值
 38             }else{
 39                 this.next.setNode(index, data);            //继续判断下一个节点
 40             }
 41         }
 42         public void removeNode(Node previous, String data){
 43             if(data.equals(this.data)){
 44                 previous.next = this.next;
 45             }else{
 46                 this.next.removeNode(this,data);
 47             }
 48         }
 49         public void toArrayNode(){        //将节点中数据转换成数组中的值
 50             Link.this.refArray[Link.this.foot++] = this.data;
 51             if(this.next != null){        //存在后续节点继续存放
 52                 this.next.toArrayNode();
 53             }
 54         }
 55
 56     }
 57     //==========================上面为Node节点=================
 58     private Node root;    //定义链表中的根节点
 59     private int count = 0;    //统计节点个数
 60     private int foot = 0;    //表示Node元素编号
 61     private String[] refArray;        //对象数组,用来存放各个节点的值
 62     public void add(String data){        //链表中添加数据
 63         if(data == null){                //为了简便,暂且设置不保存null值
 64             return ;
 65         }
 66         Node newNode = new Node(data);    //实例化一个Node节点来保存数据
 67         if(this.root == null){            //判断是否存在root节点
 68             this.root = newNode;        //不存在则将当前节点设置为root节点
 69         }else{
 70             this.root.addNode(newNode);    //存在root节点则将新节点添加到链表后面
 71         }
 72         this.count ++ ;                    //保存成功count++
 73
 74     }
 75     public int size(){        //取得节点个数
 76         return this.count;
 77     }
 78     public boolean isEmpty(){    //判断空链表
 79         //return this.count == 0;
 80         return this.root == null;
 81     }
 82     public boolean contains(String data){        //查找数据
 83         if(data == null || this.root == null){    //没有要查数据或根节点没保存数据
 84             return false ;
 85         }
 86         return this.root.containsNode(data);
 87     }
 88     public String get(int index){
 89         if(index > this.count){            //表示索引超出查询范围,没有数据
 90             return null;
 91         }
 92         this.foot = 0;                    //每次查询都是从前往后查找
 93         return this.root.getNode(index);
 94     }
 95     public void set(int index,String data){            //修改指定编号节点的内容
 96         if(index > this.count){
 97             return ;            //超出范围无法修改
 98         }
 99         this.foot = 0;                    //设置foot属性的内容
100         this.root.setNode(index,data);
101     }
102     public void remove(String data){        //移除指定数据
103         if(this.contains(data)){            //判断链表中是否存在指定数据
104             if(data.equals(this.root.data)){        //判断要删除的数据是否是root中数据
105                 this.root = this.root.next;            //移除root元素
106             }else{
107                 //继续判断下一个元素
108                 this.root.next.removeNode(this.root, data);
109             }
110         }
111         this.count--;            //删除一个节点,链表长度减一
112     }
113     public String[] toArray(){
114         if(this.root == null){
115             return null;
116         }
117         this.foot = 0;        //初始化root
118         this.refArray = new String[this.count];
119         this.root.toArrayNode();        //调用Node类中方法将每个节点数据添加到数组
120         return refArray;
121     }
122 }

  以上代码将Node类作为Link类的内部类来实现单向链表,

  public void add(String data){}:向链表中添加数据,需要为Link增加一个Node,这里将Node添加到Link的最后,每成功增加一个数据,count自增记录Link中Node的个数;

  public int size(){}:统计Link中Node元素的个数;

  public boolean isEmpty(){}:判断空链表,有两种判断方式,一种是判断root节点是否为空,另一种是判断节点个数是否为0;

  public boolean contains(String data){}:查找Link中是否存在指定数据,从root节点开始一次判断每个Node中的数据是否符合;

  public String get(int index){}:根据索引查找Link中对应的数据,索引从0开始;

  public void set(int index,String data){}:根据索引修改Link中对应的数据内容;

  public void remove(String data){}:根据指定内容移除Link中对应的Node,成功移除节点个数减1;

  public String[] toArray(){}:将Link转换成对象数组,数组长度为Link中Node的个数;

原文地址:https://www.cnblogs.com/9527yzx/p/8157355.html

时间: 2024-10-24 01:40:34

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

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

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

单向链表的简单使用

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

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

写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的"阅读更多"按钮,惹不起我躲得起. 最近面试的过程中,发现有的公司的面试题考到了链表的逆序,这一块我正好不是特别清楚.于是打算把链表这一块好好的学习学习.在网上搜寻了众多的资料以后,了解到链表的核心是节点与节点之间的互相链接. 于是自己也写了一个单向链表的类,里面包括input插入方法,inputById按指定下标插入方法,deleteAll删除所有节

单向链表的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

C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码

实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1->2->5->3->4 相当于仅仅实现了插入.遍历2个功能(当然遍历功能稍微修改就是销毁链表了) 用纯C写了份测试代码 /* 基本数据结构的定义以及函数的声明 */ typedef int ElemType; typedef struct Node { ElemType elem; struc

文章分享:简单数据结构学习:单向链表

文章分享:简单数据结构学习:单向链表:https://www.textarea.com/aprikyb/jiandan-shujujiegou-xuexi-danxiang-lianbiao-252/

C#学习单向链表和接口 IList<T>

作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: MSDN 索引器(C# 编程指南) <数据结构(C#语言版)>下载 When to use IEnumerable, ICollection, IList and List 章节: 单向链表元素 定义单向链表操作接口 逐步实现单向链表 正文: 前面学习了 IEnumerable<T>.IComparable<T>.ICollec

python数据结构链表之单向链表

本文和大家分享的主要是python中单向链表相关内容,一起来看看吧,希望对大家学习python有所帮助. 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. . 表元素域elem用来存放具体的数据. . 链接域next用来存放下一个节点的位置(python中的标识) . 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点. 节点实现 class 

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

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