链表数据结构图解 和 代码实现

项目中经常会用到LinkedList集合来存储数据,打算写一篇LinkedList的源码解析,而LinkedList是基于链表结构存储数据的,这篇博文将解析链表数据结构,包括单向链表和双向链表;

1:单向链表:

单向链表的链表对象维护了一个 first 引用,该引用指向节点链表中的第一个节点对象,每个节点对象维护一个 next 引用,next引用指向下一个节点对象;(这里注意:是引用指向的是节点对象:节点对象包含存储的数据和next引用)

以下是单向链表的图解:

java代码实现如下:

public class LinkedListDemo1 { //表示整个链表对象

    private Node first;        //链表对象的第一个引用

    public LinkedListDemo1(){

    }

    public Node getFirst() {
        return first;
    }

    public void setFirst(Node first) {
        this.first = first;
    }

    class Node{              //节点对象
         Item item;          //存储的数据对象
         Node next;          //下一个节点对象的引用
        public Item getItem() {
            return item;
        }
        public void setItem(Item item) {
            this.item = item;
        }
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }

    }
}

当需要在首位置插入元素时,图解如下:first 引用指向需要插入到链表中的节点对象,新的节点对象的next引用指向原先的首节点对象;

java代码实现如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

//插入对象到链表首位置

    public void insertFirst(Item item){

        //创建链表对象

        LinkedListDemo1 list=new LinkedListDemo1();

        //原来的首个节点暂存在:用oldFirst引用指向

        Node oldFirst=first;

        //创建需要插入的节点对象

        Node newNode=new Node();

        newNode.item=item;

        //新节点对象的next引用指向原先的首节点对象

        newNode.next=oldFirst;

        

    }

 当然这里的插入没有考虑首位置的节点对象为null的情况,插入到其他位置的节点实现原理和插入到首位置的基本差不多;

下面接收双向链表的实现原理:

链表对象中维护一个first 引用和 last引用,分别指向链表中的首末节点对象;每个节点对象维护 存储的数据对象引用,prev和next引用,用来指向前后节点对象;

双向链表的图解:

java代码实现链表对象如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

public class LinkedListDemo2 {

    private Node first;

    private Node last;

    

    

    public LinkedListDemo2(){

        

    }

    

    

    public Node getFirst() {

        return first;

    }

    public void setFirst(Node first) {

        this.first = first;

    }

    

    

    public Node getLast() {

        return last;

    }

    public void setLast(Node last) {

        this.last = last;

    }

    class Node{

         Item item;

         Node prev;

         Node next;

        public Item getItem() {

            return item;

        }

        public void setItem(Item item) {

            this.item = item;

        }

        

        public Node getPrev() {

            return prev;

        }

        public void setPrev(Node prev) {

            this.prev = prev;

        }

        public Node getNext() {

            return next;

        }

        public void setNext(Node next) {

            this.next = next;

        }

}

}

双向链表插入元素到首位:

图解:

java代码实现:


1

2

3

4

5

6

7

8

9

10

11

12

public void insertFirst(Item item){

        //暂存原先首节点对象

        Node oldFirst=first;

        //创建新的节点对象

        Node newNode=new Node();

        newNode.item=item;

        newNode.next=first;

        //first引用指向新节点对象

        first=newNode;

        //原先的节点对象的prev引用指向新节点对象

        oldFirst.prev=newNode;

    }

到此,单向链表结构和双向链表结构就解析完了,下一篇博客中将解析 LinkedList 的源码;

原文地址:https://www.cnblogs.com/austinspark-jessylu/p/9555122.html

时间: 2024-10-17 03:42:02

链表数据结构图解 和 代码实现的相关文章

【数据结构】单链表&&静态链表详解和代码实例

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存储单元.当有节点插入时,系统动态的为结点分配空间.在结点删除时,应该及时释放相应的存储单元,以防止内存泄露.由于是链式存储,所以操作单链表时,必须知道头结点或者头指针的位置.并且,在查找第i个节点时,必须找到第i-1个节点. 1.2 单链表的存储结构代码描述 对于链式存储,通过上一节的讲解相信大家已

《算法图解》代码实现和改进

<算法图解>代码实现和改进 请随意观看表演 二分查找 数组和链表 递归 递归条件和基线条件 快速排序 散列表 广度优先搜索 狄克斯特拉算法 贪婪算法 二分查找 def bin_search(list,item): low = 0 high = len(list) - 1 while low<=high: mid = (low+high)//2 #得到中间值 guess = list[mid] if guess==item: return mid elif guess>item: h

C#单链表(数据结构)

学习单链表的源码项目:http://files.cnblogs.com/xmfdsh/CSharp%E5%8D%95%E9%93%BE%E8%A1%A8.rar 链表是用一组任意的存储单元来存储线性表中的数据元素(在存储单元中可以是连续的,也可以是不连续的).链表在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息.这两部分信息组成该数据元素的存储映像,称为节点. 节点的形象图如下: 首先定义一个类Node来表示这些节点: public class Node<

《数据结构》C++代码 散列表

       散列表,又名哈希表.Hash表.这是一个神奇的数据结构,它的复杂度是常数级别,由于我非常喜欢这个数据结构,在此简单介绍一下.        (没有学过Hash表的同学,我推荐一个教程:http://www.cnblogs.com/jiewei915/archive/2010/08/09/1796042.html)        让我们回忆一下之前学过的数据结构,列个表,与Hash表做个比较(表中c表示常数): 插入时间 删除时间 查找时间 编程复杂度 信息剖析度 无序数组 1 N

1) 链表顺序存储---之二代码

参考文档: 1)<<大话数据结构>> 2)http://blog.chinaunix.net/uid-20680669-id-147844.html 3)http://blog.csdn.net/strommaybin/article/details/51919464 1. 线性表(list): 零个或多个数据元素的有限序列 线性表(Linear_list)是最常用也是最简单的数据结构.简言之,一个线性表是n个数据元素的有限序列.线性表是有线性结构的表.什么是线性结构呢?线性结构是

《数据结构》C++代码 邻接表与邻接矩阵

       上一篇"BFS与DFS"写完,突然意识到这个可能偏离了"数据结构"的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵.        存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表示i到j有没有单向边,邻接表则是对1~N中每个点都拉出一个链表来,链表E[i]中存的每个点j都表示i到j有一条单向边. 这两种方式各有利弊,在稀疏图中,邻接表更好,省时间而且省空间:在稠密图中,邻接矩阵更好,不浪费时间的同时省去了指针域的空间

静态链表过程演示及代码实现(A - B) U (B - A)

静态链表说明 使用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构 c语言定义数据结构 #define MAX_SIZE 1000 // 所有的类型都统一定义为ElemType typedef int ElemType; typedef struct { ElemType data; int cur; } component, LinkList[MAX_SIZE]; 存储结构如下图所示 静态链表的工作原理 静态链表重点是在构建两个链表:备用链表(空闲的节点)和数据

LeetCode 13.迭代法反转链表(图解)

题目描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思路 迭代法 图解 由此继续循环下去,则会把 1 -> 2 -> 3 -> 4 -> null转化为 null <- 1 <- 2 <- 3 <- 4 代码如下 public class ReverseList { /** * 迭代方法 * 1 -> 2 -&

Java基础知识强化之集合框架笔记29:使用LinkedList实现栈数据结构的集合代码(面试题)

1. 请用LinkedList模拟栈数据结构的集合,并测试:  题目的意思是:     你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟,使用LinkedList功能方法封装成自己的方法. 2. 代码解析: (1)定义自己集合类MyStack,模拟栈数据结构( 先进后出 ) 1 package cn.itcast_05; 2 3 import java.util.LinkedList; 4 5 /** 6 * 自定义的栈集合 7 * 8 * @author Mr He 9