线性表的链式存储和实现

上篇讲了顺序表,这篇接着讲讲链式表的实现。

List.java

 1 package com.yeyan.linklist;
 2
 3 /**
 4  * 线性表接口
 5  * @author yeyan
 6  * @date   2014-12-07
 7  *  * API:
 8  * isEmpty():                 判断该线性表是否为空
 9  * length():                  表长
10  * get(int index):            获得第index的元素
11  * add(int index, T element): 在index位置之后添加一个元素
12  * remove(index):             删除索引为index的元素
13  * clear() :                  清除线性表
14  *
15  */
16
17 public interface List<T> {
18     public boolean isEmpty();
19     public int length();
20     public T get(int index) throws Exception;
21     public boolean add(int index, T element) throws Exception;
22     public T remove(int index) throws Exception;
23     public void clear();
24 }

Node.java

 1 package com.yeyan.linklist;
 2 /**
 3  * 链表节点
 4  * @author yeyan
 5  * @date   2012-12-07
 6  * @param <T>
 7  */
 8 public class Node<T> {
 9     //数据域
10     public T data;
11     //指针域,指向下一个节点
12     public Node<T> next;
13
14     // 首节点构造函数
15     public Node(Node<T> next){
16         this.next = next;
17     }
18
19     //其它节点构造函数
20     public Node(T data, Node<T> next){
21         this.data = data;
22         this.next = next;
23     }
24
25     /**
26      * 获取下一个节点
27      */
28     public Node<T> getNext(){
29         return this.next;
30     }
31     /**
32      * 设置下一个节点
33      */
34     public void setNext(Node<T> next){
35         this.next = next;
36     }
37     /**
38      * 获取当前节点数据
39      */
40     public T getData(){
41         return this.data;
42     }
43     /**
44      * 设置当前节点数据
45      * @param data
46      */
47     public void setData(T data){
48         this.data = data;
49     }
50 }

LinkList.java

 1 package com.yeyan.linklist;
 2 /**
 3  * 链表的实现
 4  * @author yeyan
 5  * @date   2012-12-07
 6  * @param <T>
 7  */
 8 public class LinkList<T> implements List<T> {
 9     // 头指针
10     private Node<T> head;
11     // 当前节点指针
12     private Node<T> current;
13     // 表长
14     private int size;
15     //初始化一个空表
16     public LinkList(){
17         this.head = this.current = new Node<T>(null);
18         this.size = 0;
19     }
20
21     public void index(int index) throws Exception{
22         if(index < -1 || index > size -1){
23             throw new Exception("parameter error!");
24         }
25         if(index == -1)
26             return;
27         current = head.next;
28         int i = 0;
29         while(i < index){
30             current = current.next;
31             i ++;
32         }
33     }
34
35     @Override
36     public boolean isEmpty() {
37         return size == 0;
38     }
39
40     @Override
41     public int length() {
42         return this.size;
43     }
44
45     @Override
46     public Node<T> get(int index) throws Exception {
47         int i = 0;
48         current = head.next;
49         while(i < index && current != null){
50             current = current.next;
51             i ++;
52         }
53         return current.next;
54     }
55
56     @Override
57     public boolean add(int index, T data) throws Exception {
58         if(index < -1 || index > size){
59             throw new Exception("parameter error!");
60         }
61         index(index -1);
62         current.setNext(new Node<T>(data, current.next));
63         size ++;
64         return true;
65     }
66
67     @Override
68     public Node<T> remove(int index) throws Exception {
69         Node<T> node = get(index);
70         if(index < -1 || index > size){
71             throw new Exception("parameter error!");
72         }
73         index(index -1);
74         current.setNext(current.next.next);
75         size --;
76         return node;
77     }
78
79     @Override
80     public void clear() {}
81 }

链表的最大特点是:

         插入、删除运算方便。

缺点:

       (1)要占用额外的存储空间存储元素之间的关系,存储密度降低。存储密度是指一个节点中数据元素所占的存储单元和整个节点所占的存储单元之比。

       (2)链表不是一种随机存储结构,不能随机存取元素。

与顺序表的比较

    顺序存储是一种随机存取的结构,而链表则是一种顺序存取结构,因此它们对各种操作有完全不同的算法和时间复杂度。例如,要查找线性表中的第i个元素,对于顺序表可以直接计算出a(i)的的地址,不用去查找,其时间复杂度为0(1).而链表必须从链表头开始,依次向后查找,平均需要0(n)的时间。所以,如果经常做的运算是按序号访问数据元素,显然顺表优于链表。

    反之,在顺序表中做插入,删除时平均移动表中一半的元素,当数据元素的信息量较大而且表比较长时,这一点是不应忽视的;在链表中作插入、删除,虽然要找插入位置,但操作是比较操作,从这个角度考虑显然后者优于前者。

时间: 2024-07-30 13:48:59

线性表的链式存储和实现的相关文章

线性表的链式存储结构

1 n个结点链结成一个链表,即为线性表的链式存储结构,由于每一个结点只包含一个指针域,因此称为单链表. 链表中第一个结点的存储位置成为头指针,那么整个链表的存取就必须是从头指针开始了. 有时候会在单链表的第一个结点前附设一个结点,称为头结点. 头指针与头结点的区别: 头指针: (1)头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针. (2)头指针具有标识作用,所以常用头指针冠以链表的名字. (3)无论链表是否为空,头指针都不为空.头指针是链表的必要元素. 头结点: (1)

线性表的链式存储之单链表的尾插法

对单链表进行遍历.查找.插入.删除等操作,最终效果如下: 相关C代码如下: /*线性表的链式存储之单链表的尾插法*/ #include <stdio.h> #include <stdlib.h> #include <malloc.h> /*定义变量*/ typedef int DataType; typedef struct node{     //定义链表结点数据结构 DataType data; struct node * pNext; }NODE; typedef

线性表的链式存储

线性表的链式存储 线性表的链式存储 基本概念 设计与实现 实现代码 优缺点 1. 基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息 数据结点 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息 尾结点 链表中的最后一个数据结点,其下一元素指针为空,表示无后继. 2.设计与实现 在C语言中可以用结构体来定义链

数据结构之线性表(链式存储结构)

线性表的实现分顺序存储结构和链式存储结构 上一节我们主要介绍了顺序存储结构,在最后我们还分别总结了顺序存储结构的优缺点, 对于顺序结构的缺点,我们有没有什么好的解决方法呢? 我们今天要介绍的线性表的链式存储结构就可以很好的解决顺序结构的缺点,一起来看. 顺序结构最大的缺点就是在进行插入和删除操作的时候,如果插入位置不理想,那么我们需要移动大量的元素,那产生这一问题的原因是什么呢? 仔细分析后,我们可以发现在顺序存储结构中,他们相邻的元素的存储位置也是相邻的,我们在申请内存的的时候,是一次性申请一

leetcode_1题——Swap Nodes in Pairs(线性表的链式存储)

Swap Nodes in Pairs Total Accepted: 45110 Total Submissions: 138992My Submissions Question Solution Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2->3->4, you should return the list as 2->1->4-

数据结构第三篇——线性表的链式存储之单链表

线性表的链式存储结构的特点是用一组任意的存储单元来存储线性表的数据元素,这些单元可以分散在内存中的任意位置上,其在物理上可以是连续的,也可以是不连续的.具有链式存储结构的线性表称为线性链表. 为了表示出每个数据元素与其后继之间的关系,除了存储数据元素本身的信息之外,还需存储指示其直接后继的信息.这可以用一个结点(node)来完整的表示. 将节点中存储数据元素本身信息的域称为数据域:存储其直接后继位置的域称为指针域.指针域中存储的信息称作指针或链. 一般情况下,链表中每个结点可以包含若干个数据域和

【数据结构】-线性表的链式存储结构

引言:由于线性表的顺序存储结构在插入和删除时需要大量移动数据元素,从而引入线性表的链式存储结构. 线性表的链式存储结构:用一组任意的存储单元(可以连续也可以不连续)存储线性表的数据元素. 为了表示数据元素ai和其直接后继ai+1之间的逻辑关系,对ai来说,除了存储其本身的数据信息外,还需要存储其直接后继的存储位置.这两部分信息组成数据元素ai的存储映像(结点).它包含两个域:其中存储数据元素信息的域称为数据域:存储直接后继存储位置的域称为指针域. n个结点链接成一个链表,称为线性链表,由于此链表

线性表 顺序存储 链式存储 ---java实现

首先抽象出一个线性表抽象类(包含基本的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E t); public abstract void add(int index,E t); public abstract void remove(); public abstract void remove(int index); public abstract int getCount(); public

数据结构开发(5):线性表的链式存储结构

0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? 链式存储的定义: 为了表示每个数据元素与其直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息. 链式存储逻辑结构: 基于链式存储结构的线性表中,每个结点都包含数据域和指针域 数据域:存储数据元素本身 指针域:存储相邻结点的地址 专业术语的统一: 顺序表 基于顺序存储

数据结构--线性表的链式存储结构

一 线性表的链式存储结构 A.链式存储的定义为了表示每个数据元素与直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息图示B链式存储逻辑结构基于链式存储结构的线性表中,每个结点都包含数据域和指针域1.数据域:存储数据元素本身2.指针域:存储相邻结点的地址图示C链表中的基本概念1.头结点--链表中的辅助结点,包含指向第一个数据元素的指针(方便插入和删除)2.数据结点--链表中代表数据元素的结点,表现形式为:(数据元素,地址)3.尾节点--链表中的最后一个数据结点,包