`

数据结构之链表

阅读更多

数组的两大缺点:

1。若改变数组的大小就要创建一个新的数组,并需要从原数组复制所有的数据到新的数组

2。数组元素在内存中依次顺序存储,这意味着向数组插入一项要移动数组中的其他元素

因此,我们使用链式结构,链式结构是存储数据的结点以及指向其他节点的指针的集合。如此一来,节点可以位于内存的任意位置,而且从一个节点到另一个节点的传递可以通过在结构中存储节点间引用来实现。

一。单向链表

1。链表:

如果一个节点包含指向另一个节点的数据值,那么多个节点可以连接成一串,只通过一个变量访问整个节点序列,这样的节点序列称为链表(linked list)

2。单向链表:

如果每个节点仅包含其指向后继节点的引用,这样的链表称为单向链表。

一个整型单向链表的实现:

 

package  com.sohu.blog.denns_zane.list;

/** */ /**
 * 
@author  dennis
 * @Description 整型单向链表节点
 
*/

public   class  IntSLLNode  {
    
public   int  info;  //  用户信息

    
public  IntSLLNode next;  //  下一个节点,自引用

    
/** */ /**
     * 
@param  info
     * 
@param  next
     
*/

    
public  IntSLLNode( int  info, IntSLLNode next)  {
        
this .info  =  info;
        
this .next  =  next;
    }


    
/** */ /**
     * 
@param  info
     
*/

    
public  IntSLLNode( int  info)  {
        
this (info,  null );
    }


}


/** */ /**
 * 
 
*/

package  com.sohu.blog.denns_zane.list;

/** */ /**
 * 
@author  dennis
 * desc: 整型单向链表
 
*/

public   class  IntSLList  {
    
protected  IntSLLNode head, tail;

    
public  IntSLList()  {
        head 
=  tail  =   null ;
    }


    
public   boolean  isEmpty()  {
        
return  head  ==   null ;
    }


    
/** */ /**
     * @description 增加新节点,并设置它的next为原head
     * 
@param  el
     
*/

    
public   void  addToHead( int  el)  {
        head 
=   new  IntSLLNode(el, head);
        
if  (tail  ==   null )
            tail 
=  head;
    }


    
/** */ /**
     * @description 增加新节点,并设置原tail的next为新节点
     * 
@param  el
     
*/

    
public   void  addToTail( int  el)  {
        
if  ( ! isEmpty())  {
            tail.next 
=   new  IntSLLNode(el);
            tail 
=  tail.next;
        }
  else   {
            head 
=  tail  =   new  IntSLLNode(el);
        }

    }


    
public   int  deleteFromHead()  {
        
if  (head  ==   null )
            
throw   new  NullPointerException();
        
int  el  =  head.info;
        
if  (head  ==  tail)
            head 
=  tail  =   null ;
        
else
            head 
=  head.next;
        
return  el;
    }


    
public   int  deleteFromTail()  {
        
if  (head  ==   null )
            
throw   new  NullPointerException();
        
int  el  =  tail.info;
        
if  (head  ==  tail)
            head 
=  tail  =   null ;
        
else   {
            IntSLLNode temp;
            
for  (temp  =  head; temp.next  !=   null   &&  temp.next  !=  tail; temp  =  temp.next)
                tail 
=  temp;
            System.out.println(tail.info);
            tail.next 
=   null ;
        }

        
return  el;

    }


    
public   void  printAll()  {
        
for  (IntSLLNode temp  =  head; temp  !=   null ; temp  =  temp.next)
            System.out.print(temp.info 
+   "   " );
    }


    
public   boolean  isInList( int  el)  {
        
for  (IntSLLNode temp  =  head; temp  !=   null ; temp  =  temp.next)  {
            
if  (temp.info  ==  el)
                
return   true ;
        }

        
return   false ;

    }


    
/** */ /**
     * 
@param  el
     
*/

    
public   void  delete( int  el)  {
        
if  ( ! isEmpty())  {
            
if  (head  ==  tail  &&  head.info  ==  el)
                head 
=  tail  =   null ;
            
else   if  (head.info  ==  el)
                head 
=  head.next;
            
else   {
                IntSLLNode pred, temp;
//  pred为找的节点的前一节点,temp即为找到的节点
                 for  (pred  =  head, temp  =  head.next; temp  !=   null ; pred  =  pred.next, temp  =  temp.next)  {
                    
if  (temp.info  ==  el)  {
                        pred.next 
=  temp.next;  //  前一节点的next设置为当前节点的next
                         if  (temp  ==  tail)
                            tail 
=  pred;
                    }

                }

            }

        }

    }

}



二。双向链表

单向链表的deleteFromTail()方法指出了单向链表的固有问题,这种链表的节点仅仅包含指向后继节点的引用,所以无法立即访问它的前驱节点,不得不扫描整个链表来查找此前驱节点。因此,我们重新定义链表节点,包含两个引用,一个指向前驱节点,一个指向后驱节点,也就是——双向链表。
一个整型双向链表的实现:
/** *//**
 * 
 
分享到:
评论

相关推荐

    算法-数据结构之链表合并算法.rar

    本资料“算法-数据结构之链表合并算法.rar”包含的“数据结构之链表合并算法.pdf”应该详细探讨了这个主题。 首先,链表的基本概念是必不可少的。链表由一系列节点构成,每个节点包含数据元素和指向下一个节点的...

    数据结构-使用javascript讲解数据结构之链表.zip

    本资料包“数据结构-使用javascript讲解数据结构之链表.zip”将深入探讨链表的概念、实现以及其在JavaScript中的应用。 链表不同于数组,数组是连续的内存空间,而链表的元素在内存中是非连续存储的。每个元素称为...

    C语言中数据结构之链表归并排序实例代码

    C语言中数据结构之链表归并排序实例代码 问题  设有两个无头结点的单链表,头指针分别为ha,hb,链中有数据域data,链域next,两链表的数据都按递增排序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中...

    数据结构之链表,C#链表;数据结构之链表,C#链表

    链表是一种重要的数据结构,它在计算机科学中扮演着至关重要的角色,特别是在处理动态数据集合时。相较于数组,链表不需预先分配连续的内存空间,因此在插入和删除操作上具有更高的灵活性。本主题主要关注C#语言中的...

    数据结构之链表的实现

    线性表的存储结构使用链表。 2、提供操作:自表首插入元素、删除指定元素、搜索表中是否有指定元素、输出链表。 3、接收键盘录入的一系列整数(例10,25,8,33,60)作为节点的元素值,创建链表。输出链表内容。 4、输入...

    数据结构之链表的全部代码

    链表是一种基础且重要的数据结构,它在计算机科学中扮演着关键角色,特别是在处理动态数据集合时。相较于数组,链表允许更灵活的内存管理,因为它不需要预先分配连续的存储空间。下面,我们将深入探讨链表的概念、...

    链表-数据结构之链表(Python语言描述)链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点

    链表----数据结构之链表(Python语言描述) 链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。相比于数组,链表具有更灵活的插入和删除操作,但访问元素的效率较低。在...

    01基础数据结构之链表

    链表数据结构知识点 链表是一种基本的数据结构,它是一种非顺序存储结构,通过指针将各个节点连接起来,每个节点都包含了数据和指向下一个节点的指针。链表的优点是可以动态地增减节点,插入和删除节点的时间复杂度...

    C通用范例源代码之数据结构之链表.pdf

    在C语言中,链表是一种基础且重要的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。上述文件中包含了几个关于链表操作的C语言源代码范例,主要涉及链表的创建、遍历以及按序号查找节点。 ...

    数据结构之链表栈与队列

    链表、栈和队列是计算机科学中基础且重要的数据结构,它们在程序设计和算法实现中发挥着关键作用。本文将深入探讨这些概念,并结合实际应用进行解析。 首先,我们要理解链表的基本原理。链表不同于数组,它不是连续...

    数据结构-链表 数据结构 链表

    ### 数据结构之链表详解 #### 一、链表基本概念 **链表**是一种常见的数据结构,它通过一组地址不连续的存储单元来存储线性表中的各个数据元素。链表中的每个元素称为**结点**,这些结点不仅包含实际的数据信息,...

    Python数据结构之链表实现

    1.使用Python语言实现链表数据结构 2.基于类封装思想 3.实现链表增删改查功能 4.有测试数据

    数据结构顺序链表的实现

    数据结构顺序链表的实现数据结构顺序链表的实现数据结构顺序链表的实现数据结构顺序链表的实现数据结构顺序链表的实现数据结构顺序链表的实现

    数据结构之链表--一元多项式的计算

    在IT领域,数据结构是计算机科学中的核心概念之一,它涉及到如何有效地组织和管理大量数据。链表作为基本的数据结构类型,广泛应用于各种算法和程序设计中。本话题聚焦于链表的应用,具体来说,是利用链表实现一元...

    数据结构 三叉链表表示的二叉树

    本文将深入探讨一种特殊的数据结构表示——三叉链表表示的二叉树。这种表示方式在C++语言中尤为常见,它允许我们高效地创建、插入、删除节点以及进行循环算法遍历二叉树。 首先,我们要理解什么是二叉树。二叉树是...

    数据结构C++链表

    在C++中,链表是一种常见的数据结构,它不同于数组,不需要连续的内存空间来存储元素。本项目专注于C++实现的单链表,提供了一个完整的可运行示例,包括`main.cpp`主程序,以及`linklist.h`和`node.h`两个头文件,...

    数据结构之链表源码-思路清晰纯C

    单链表 单循环链表 双链表 双循环链表 内容学习于 https://www.bilibili.com/video/BV1W64y1z7jh?p=19&spm_id_from=pageDriver&vd_source=4d33bf4ac4499f2c0370694554a02fa5

Global site tag (gtag.js) - Google Analytics