java实现--单向链表的插入和删除

原创 2018年04月17日 09:32:43

一、链表结构: (物理存储结构上不连续,逻辑上连续;大小不固定)           

概念:

  链式存储结构是基于指针实现的。我们把一个数据元素和一个指针称为结点

        数据域:存数数据元素信息的域。

        指针域:存储直接后继位置的域。

链式存储结构是用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来。链式存储结构的线性表称为链表

链表类型:

  根据链表的构造方式的不同可以分为:

  • 单向链表
  • 单向循环链表
  • 双向循环链表

二、单链表:

概念:

 链表的每个结点中只包含一个指针域,叫做单链表(即构成链表的每个结点只有一个指向直接后继结点的指针

单链表中每个结点的结构:

912d954f-de3f-4d35-bd01-3c4f87d9993b

1、头指针和头结点:

单链表有带头结点结构不带头结点结构两种。

“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点的指针

头指针所指的不存放数据元素的第一个结点称作头结点(头结点指向首元结点)。头结点的数据域一般不放数据(当然有些情况下也可存放链表的长度、用做监视哨等)

存放第一个数据元素的结点称作第一个数据元素结点,或称首元结点

如下图所示:

5fdb1362-fd98-4d23-9932-271f2ab9d480

不带头结点的单链表如下:

14c9aae5-c9fc-4dbe-b5c4-29c05ed84c5e

带头结点的单链表如下图:

a9afd20d-da0f-4c59-a2d6-d8eb8175933b

关于头指针和头结点的概念区分,可以参考如下博客:

http://blog.csdn.net/hitwhylz/article/details/12305021

2、不带头结点的单链表的插入操作:

912a8385-5a98-48b8-a515-8dfd9347042d

上图中,是不带头结点的单链表的插入操作。如果我们在非第一个结点前进行插入操作,只需要a(i-1)的指针域指向s,然后将s的指针域指向a(i)就行了;如果我们在第一个结点前进行插入操作,头指针head就要等于新插入结点s,这和在非第一个数据元素结点前插入结点时的情况不同。另外,还有一些不同情况需要考虑。

因此算法对这两种情况就要分别设计实现方法

3、带头结点的单链表的插入操作:(操作统一,推荐)

95b7d67d-ddaa-4b00-99f6-c1acf4f708b1

上图中,如果采用带头结点的单链表结构,算法实现时,p指向头结点,改变的是p指针的next指针的值(改变头结点的指针域),而头指针head的值不变

因此,算法实现方法比较简单,其操作与对其它结点的操作统一

 

问题1:头结点的好处:

  头结点即在链表的首元结点之前附设的一个结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理,编程更方便。

问题2:如何表示空表:

  无头结点时,当头指针的值为空时表示空表;
  有头结点时,当头结点的指针域为空时表示空表。

 

如下图所示:

问题3:头结点的数据域内装的是什么?

头结点的数据域可以为空,也可存放线性表长度等附加信息,但此结点不能计入链表长度值

三、单项链表的代码实现

1、结点类:

编写一个Node类来充当结点的模型。我们知道,其中有两个属性,1存放数据的data,2存放下一结点的引用,

public class Node {
    //为了方便,这两个变量都使用public,而不用private就不需要编写get、set方法了。
    //存放数据的变量,简单点,直接为int型
    public int data;
    //存放结点的变量,默认为null
    public Node next;
    
    //构造方法,在构造时就能够给data赋值
    public Node(int data){
        this.data = data;
    }
}
 单链表的简单操作(增加,删除,获取总长度,链表元素排序,链表遍历)

1.1增加结点操作,addNode(Node)

 /**
     * 增加操作
     *         直接在链表的最后插入新增的结点即可
     *         将原本最后一个结点的next指向新结点
     */
    public void addNode(Node node){
        //链表中有结点,遍历到最后一个结点
        Node temp = head;    //一个移动的指针(把头结点看做一个指向结点的指针)
        while(temp.next != null){    //遍历单链表,直到遍历到最后一个则跳出循环。
            temp = temp.next;        //往后移一个结点,指向下一个结点。
        }
        temp.next = node;    //temp为最后一个结点或者是头结点,将其next指向新结点
    }
1.2插入结点到链表的指定位置。 insertNodeByIndex(int index,Node node)
/**
     * insertNodeByIndex:在链表的指定位置插入结点。
     *         插入操作需要知道1个结点即可,当前位置的前一个结点
     * index:插入链表的位置,从1开始
     * node:插入的结点
     */
    public void insertNodeByIndex(int index,Node node){
        //首先需要判断指定位置是否合法,
        if(index<1||index>length()+1){
            System.out.println("插入位置不合法。");
            return;
        }
        int length = 1;            //记录我们遍历到第几个结点了,也就是记录位置。
        Node temp = head;        //可移动的指针
        while(head.next != null){//遍历单链表
            if(index == length++){        //判断是否到达指定位置。
                //注意,我们的temp代表的是当前位置的前一个结点。
                //前一个结点        当前位置        后一个结点
                //temp            temp.next     temp.next.next
                //插入操作。
                node.next = temp.next;            
                temp.next = node;                
                return;
            }
            temp = temp.next;
        }
    }

1.3删除指定位置上的结点  delNodeByIndex(int index)

 /**
     * 通过index删除指定位置的结点,跟指定位置增加结点是一样的,先找到准确位置。然后进行删除操作。
     *             删除操作需要知道1个结点即可:和当前位置的前一个结点。
     * @param index:链表中的位置,从1开始
     * 
     */
    public void delNodeByIndex(int index){
        //判断index是否合理
        if(index<1 || index>length()){
            System.out.println("给定的位置不合理");
            return;
        }

        //步骤跟insertNodeByIndex是一样的,只是操作不一样。    
        int length=1;
        Node temp = head;
        while(temp.next != null){
            if(index == length++){
                //删除操作。
                temp.next = temp.next.next;    
                return;
            }
            temp = temp.next;
        }    
    }

1.4计算单链表的长度

/**
     * 计算单链表的长度,也就是有多少个结点
     * @return    结点个数
     */
    public int length() {
        int length=0;
        Node temp = head;
        while(temp.next != null){
            length++;
            temp = temp.next;
        }
        return length;
    }

1.5遍历单链表,打印data

/**
     * 遍历单链表,打印所有data
     */
    public void print(){
        Node temp = head.next;
        while(temp != null){
            System.out.print(temp.data+",");
            temp = temp.next;
        }
        System.out.println();
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Luna_ll/article/details/79969456

在Visual Studio 6.0集成环境中开发设备驱动程序的方法

正文: 在Visual Studio 6.0集成环境中开发设备驱动程序的方法  在Windows上,Windows DDK提供的开发环境是基于命令行的,操作起来极为不便,相信进行过驱动程序开发的朋友一...
  • CandyCat
  • CandyCat
  • 2001-05-18 20:11:00
  • 911

数据结构Java实现【3】----单向链表的插入和删除

【声明】  欢迎转载,但请保留文章原始出处→_→  生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhva...
  • u014800380
  • u014800380
  • 2016-09-23 23:06:05
  • 1257

数据结构Java实现 --单向链表的插入和删除

文本主要内容: 链表结构单链表代码实现单链表的效率分析 一、链表结构: (物理存储结构上不连续,逻辑上连续;大小不固定)            概念:   链式存储结构是基于指针实现的。我们把...
  • mlljava1111
  • mlljava1111
  • 2015-10-08 22:23:04
  • 5632

java中单项链表实现方法:增加、删除、插入数据

本文转自http://www.bianceng.cn/Programming/sjjg/201407/42457.htm,作者不详。 java的API里面已经提供了单向链表的类,大家可以直接拿来用...
  • gg543012991
  • gg543012991
  • 2016-03-31 21:28:50
  • 1845

线性表之单向链表的创建、插入、删除和清除

1.源程序 list.c #include #include typedef struct node{ int num; char name[128]; struct node *...
  • tankai19880619
  • tankai19880619
  • 2013-10-09 14:34:58
  • 3679

[转]C语言之单向链表的创建插入删除等功能

数据结构学习笔记之链表(C语言版) 分类: 技术交流2015-01-04 18:34 183人阅读 评论(0) 收藏 举报 数据结构c语言线性表单链表合并        链表是一种物理存储...
  • rc0711
  • rc0711
  • 2015-06-11 17:20:33
  • 586

链表的建立、插入、删除操作的JAVA实现

  • 2008年12月30日 12:43
  • 4KB
  • 下载

面试之路(10)-BAT面试之java实现单链表的插入和删除

链表的结构:链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现:节点类 构造函数 数据域的get,set方法 指针域的get,set方法 ...
  • u010321471
  • u010321471
  • 2016-04-28 22:18:13
  • 7417

java实现单链表,功能有插入,删除,遍历。

public class Code {private int data;private Code next;public int getData() { return data;}public voi...
  • raindew1985
  • raindew1985
  • 2007-06-27 02:12:00
  • 3604

单向动态链表的创建、输入、插入、删除、输出

#include #include /*如以Turbo C作编译工具请删除此句*/#define LEN sizeof(struct student)struct student{ long num;...
  • huangyiyun
  • huangyiyun
  • 2008-01-14 10:23:00
  • 3039
收藏助手
不良信息举报
您举报文章:java实现--单向链表的插入和删除
举报原因:
原因补充:

(最多只允许输入30个字)