单链表Java实现

  单链表的实现需要定义两个类,一个是Node类,存储了节点的数据值以及后继节点的引用。另外一个类就是list,用于存储这些Node节点。单链表的插入和删除操作有两种方法:头结点插入(删除)和末节点插入(删除)。无论是头结点插入还是末节点插入,需要考虑的特殊情况是如果链表是空的话,方法适合也适合。同时,如果链表是空的话,需要更新tail的值为指向插入的节点。无论是头结点删除还是末节点删除,首先检测链表大小,如果为空的话,输出提示信息,不做其他操作。另外还需要考虑链表只有一个节点的情况。总而言之,头结点的插入和删除操作,时间复杂度均是O(1),而末节点的插入操作是O(1),删除操作是O(n)。相比而言,头结点插入和删除效率较高。具体实现代码如下:

  1 /**
  2  * Created by hfz on 2016/8/2.
  3  * 单链表的实现需要定义两个类,一个是Node类,存储了节点的数据值以及后继节点的引用。
  4  * 另外一个类就是list,用于存储这些Node节点。
  5  */
  6 public class list {
  7     private Node head=new Node();//指向链表首节点引用,虽然head中各元素为null,不过head不为null,是一个对象了
  8     private Node tail=new Node();//指向链表末节点引用
  9     private int size=0;
 10     /*
 11     无论是头结点插入还是末节点插入,需要考虑的特殊情况是如果链表是空的话,方法适合也适合。同时,如果链表是空的话,需要更新
 12     tail的值为指向插入的节点。
 13     无论是头结点删除还是末节点删除,首先检测链表大小,如果为空的话,输出提示信息,不做其他操作。另外还需要考虑链表只有一个节点
 14     的情况。
 15     总而言之,头结点的插入和删除操作,时间复杂度均是O(1),而末节点的插入操作是O(1),删除操作是O(n)。
 16     相比而言,头结点插入和删除效率较高。
 17      */
 18
 19     /*
 20     头结点插入:
 21     1.将首节点引用赋值给插入节点的next域。
 22     2.将插入节点的引用赋值给首节点。
 23     这种方法在链表为空是依然适用,只不过需要设置tail值为插入节点的引用。
 24     操作在O(1)时间内完成
 25      */
 26     //头结点插入
 27     public void addAtHead(Node node){
 28         node.setNext(head);//next域指向当前首节点
 29         head=node;//链表的head指向新插入的节点
 30         if(size++==0){//如果当前是空链表,更新末节点引用。
 31             tail=node;
 32         }
 33     }
 34     /*
 35     头结点删除:只需要将头指针指向的节点的next域赋值给头指针即可。
 36     即使单链表只有一个节点,这种方法依然正确,只不过,这种情况下需要设置tail为null
 37     操作在O(1)时间内完成
 38      */
 39     //头结点删除
 40     public void deleteAtHead(){
 41      if(size>0)
 42         {
 43             head = head.getNext();
 44             if (size-- == 1) {
 45                 tail = new Node();
 46             }
 47         }
 48         else{
 49             System.out.println("链表为空,不能删除节点");
 50         }
 51     }
 52     /*
 53     末节点插入
 54      */
 55     public void addAtTail(Node node){
 56         node.setNext(null);
 57         tail.setNext(node);// Node tail=new Node();必须使用这种形式给tail赋初值,虽然tail中各内容是null,不过tai已经是对象
 58         //可以调用setNext()方法。如果是以Node tail=null,就会抛出空指针异常“.NullPointerException”,因为tail并不是对象,
 59         // 不能调用方法
 60         tail=node;
 61         if(size++==0){
 62             head=node;
 63         }
 64     }
 65     /*
 66     末节点删除
 67      */
 68     public void deleteAtTail(){
 69         Node tempNode=head;
 70         Node preNode=new Node();
 71         if(size>0){
 72             while (!tempNode.equals(tail)){
 73                 preNode=tempNode;
 74                 tempNode=tempNode.getNext();
 75             }
 76             preNode.setNext(null);
 77             tail=preNode;
 78             if(size--==1){
 79                 head=new Node();
 80             }
 81         }
 82         else {
 83             System.out.println("链表为空,不能删除节点");
 84         }
 85     }
 86     //测试代码
 87     public static void main(String[] args){
 88         list ls=new list();
 89         ls.addAtTail(new Node("D1",null));
 90         ls.addAtHead(new Node("A", null));
 91         ls.addAtHead(new Node("B", null));
 92         ls.addAtHead(new Node("C", null));
 93         ls.deleteAtHead();
 94         ls.deleteAtHead();
 95         ls.deleteAtHead();
 96         ls.deleteAtHead();
 97         ls.deleteAtHead();
 98         ls.addAtTail(new Node("D1", null));
 99         ls.addAtTail(new Node("D2", null));
100         ls.addAtTail(new Node("D3", null));
101         ls.addAtTail(new Node("D4",null));
102         ls.deleteAtTail();
103         ls.deleteAtTail();
104         System.out.println();
105     }
106 }
107 class Node {
108         private Object ele;
109         private Node next;
110         public Node(){
111             this(null,null);
112         }
113         public Node(Object ele,Node next){
114             this.ele=ele;
115             this.next=next;
116         }
117
118         public Object getEle(){
119             return ele;
120         }
121         public Object setEle(Object ele){
122             Object oldEle=this.ele;
123             this.ele=ele;
124             return oldEle;
125         }
126
127         public Node getNext(){
128             return next;
129         }
130
131         public void setNext(Node newNext){
132             next=newNext;
133         }
134     }

时间: 2024-12-31 03:48:33

单链表Java实现的相关文章

单链表java简易实现

巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package com.shine.test.datastruct; /** * 简易链表 * * @author SHINE * * @param <E> */ public class LinkList<E> { private Node head, tail; private int size =

数据结构----顺序表与单链表(JAVA)

下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protected Object[] element; 4 5 public SeqList(int length) { 6 this.element = new Object[length]; 7 this.n = 0; 8 } 9 10 public SeqList() { 11 this(64); 12 } 13 1

数据结构复习--java实现单链表基本操作

单链表的基本操作包括建立单链表.查找运算(按序查找和按值查找).插入运算(前插和后插)和删除运算.下面给出具体的java实现程序: package com.zpp.test; //首先创建一个节点类 public class Node { private Node next; //指针域 private int data;//数据域 public Node( int data) { this. data = data; } } package com.zpp.test; public class

JAVA实现具有迭代器的线性表(单链表)

一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用到依次遍历单链表中的每一个元素.一般而言,我们就是用for循环来实现遍历,这样,当你新增一个对单链表的操作并需要使用遍历时,你就得重新写一个for循环而实现遍历.那么,为什么不将迭代(遍历)作为一种基本的ADT操作(基本的ADT操作如:新增一个元素.删除一个元素)呢?于是,迭代器就出场了. 2,鉴于

java 单链表的实现

package liaobiao;//链表测试public class Node { private int value; private Node next; //存放下一个节点的指针 //构造方法,进行传参 public Node(int value){ this.value = value; } public Node(){ } //像链表的尾部加入元素,需要先找到最后一个节点 public void addNode(Node n ){ //需要先找到最后一个节点 Node node =t

Java数据结构-线性表之单链表LinkedList

线性表的链式存储结构,也称之为链式表,链表:链表的存储单元可以连续也可以不连续. 链表中的节点包含数据域和指针域,数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个头结点和头指针的区别: 头指针: 指向链表的第一个节点的指针,若链表有头结点,则是指向头结点的指针: 头指针具有标识作用,所以常用头指针作为链表的名字: 不论链表是否为空,头指针都不为空: 是链表的必要元素. 头结点: 头结点是为了操作的统一和方便而设立的,放在第一个元素节点的前面,其数据域一般无意

单链表是否有环的问题解决与讨论(java实现)

单链表是否有环的问题经常在面试中遇到,一般面试中会要求空间为O(1);再者求若有环,则求环产生时的起始位置. 下面采用java实现. //单链表class ListNode{ int val; ListNode next; ListNode(int x){ val=x; next=null; } } public class SearchCycleNode{ ListNode equalListNode=null;//来记录判断有环时出现的相等的时的节点,姑且叫"相遇"节点. //从&

java单链表代码实现

用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String name; private Node next; public Node(String name){ this.name=name; } public void setname(String name){ this .name = name; } public String getname(){

Java 实现简答的单链表的功能

作者:林子木  博客网址:http://blog.csdn.net/wolinxuebin 参考网址:http://blog.csdn.net/sunsaigang/article/details/5751780 描述:使用java实现简答的单链表的功能 定义了一个MyList类 包含的函数: getHead()返回头指针: isEmpty() 判断是否为空: addFirst(T element)在链表的头部加入元素: addLast(T element)在链表的尾部加入元: add(T fi