1.什么是链表
链表是一种物理储存单元上非连续,非顺序的储存结构,链表由一系列节点组成,节点可以在运行
时动态生成。每个节点包括两个部分:一个是储存元素数据的数据域,另一个是储存下一个节点地址的指针域。
2.链表的构建
下面以一个双向链表为例构建链表
首先定义一个链表接口,代码如下:
public interface NodeLinkedListInterface {
/**
* 添加节点的方法
*
* @param node新添加的节点对象
*/
public abstract void add(Node node);
/**
* 在指定索引位置添加新节点
*
* @param node要添加的新节点
* @param index指定的索引位置
*/
public abstract void add(Node node, int index);
/**
* 让指定位置的节点互相交换位置
* @param index1,index2指定的节点位置
*/
public abstract void exchange(int index1,int index2);
/**
* 移除指定的节点
*
* @param node要被移除的节点对象
* @return 返回true和false,true表示移除成功,false表示移除失败
*/
public abstract boolean remove(Node node);
/**
* 移除指定所以位置的节点
*
* @param index指定要移除的节点索引
* @return 返回true和false,true表示移除成功,false表示移除失败
*/
public abstract boolean remove(int index);
/**
* 获取指定索引位置的节点对象
*
* @param index指定的索引位置
* @return 返回节点对象,如果index的范围超出size,则返回null.
*/
public abstract Node get(int index);
/**
* 获取双链表中存储的元素总数
*
* @return 返回size的值,如果为0则表示链表中没有节点
*/
public abstract int size();
}
定义节点类:
public class Node {
private Object obj;
private Node next;
private Node previous;
public Node(Object obj){
this.obj=obj;
}
public Node(Object obj, Node next, Node previous) {
super();
this.obj = obj;
this.next = next;
this.previous = previous;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node getPrevious() {
return previous;
}
public void setPrevious(Node previous) {
this.previous = previous;
}
}
然后实现接口,代码如下:
public class LinkedList implements NodeLinkedListInterface {
private int size;
private Node root = null;
private Node last = null;
public LinkedList() {
this.size = 0;
}
/**
* 链表构造方法
*
* @param size
* @param root
* @param last
*/
public LinkedList(int size, Node root, Node last) {
super();
this.size = size;
this.root = root;
this.last = last;
}
public void add(Node node) {
size++;
if (root == null) {
root = node;
root.setPrevious(null);
last = root;
} else {
last.setNext(node);
node.setPrevious(last);
node.setNext(null);
last = node;
}
public void add(Node node, int index) {
if (index < 0 || index > size) {
System.out.println("没有该位置");
} else if (index == 0) {
Node cnode = root;
root = node;
node.setNext(cnode);
cnode.setPrevious(node);
} else {
Node newnode = this.get(index);
// 获取父节点
Node fnode = newnode.getPrevious();
// 使父节点指向要添加的节点
fnode.setNext(node);
node.setPrevious(fnode);
node.setNext(newnode);
newnode.setPrevious(node);
}
size++;
}
public boolean remove(Node node) {
Node newnode = root;
for (int i = 0; i < size; i++) {
if (newnode == node) {
// 获取要移除的节点的父节点和子节点,使其相连
Node fnode = newnode.getPrevious();
Node cnode = newnode.getNext();
if (fnode == root) {
root = root.getNext();
} else if (cnode == last) {
last = last.getPrevious();
} else {
fnode.setNext(cnode);
cnode.setPrevious(fnode);
newnode = null;
}
break;
} else {
newnode = newnode.getNext();
}
}
size--;
return false;
}
public boolean remove(int index) {
if (index < 0 || index > size) {
System.out.println("没有该位置");
} else {
Node node = this.get(index);
// 获取要移除的节点的父节点和子节点,使其相连
Node fnode = node.getPrevious();
Node cnode = node.getNext();
if (fnode == null) {
root = root.getNext();
} else if (cnode == null) {
last = last.getPrevious();
} else {
fnode.setNext(cnode);
cnode.setPrevious(fnode);
node = null;
}
}
size--;
return false;
}
public Node get(int index) {
if (index < 0 || index > size) {
System.out.println("要返回的结果不存在");
return null;
}
Node node = root;
for (int i = 0; i < index; i++) {
node = node.getNext();
}
return node;
}
public int size() {
return size;
}
}
3.链表的优缺点
优点:1.方便添加和删除
2.长度可以变
缺点:1.访问效率低
分享到:
相关推荐
数组和链表总结 数组和链表.txt
链表是学习数据结构的大门,在微软等大公司招聘c\c++技术人员的时候有3个会必然出现 的东西,指针、链表、二叉树!
### C语言中链表的基本概念及操作 #### 一、链表的概念 链表是一种常见的线性数据结构,与数组不同的是,链表中的元素不是连续存储的,而是通过节点之间的链接来组织数据。每个节点通常包含两部分:数据域(用于...
链表总结,c语言版本,巩固基础知识,适用于求职面试,来自互联网,版权归著者
最后对链表总结,归纳梳理了一系列关键的概念、技能和实用解题手段。面向的对象主要是具有一定基础的编程学习者和技术求职人员,适用于面试准备、技术提升等场合。学习者能够从中获得扎实的基础理解和高效解决复杂...
Java链表是编程中一种基础且重要的数据结构,它在许多场景下有着广泛的应用。本文将结合个人学习心得,深入探讨Java链表的核心概念、实现方式以及与其他编程语言的互通性。 首先,链表是一种线性数据结构,与数组...
在计算机科学领域,链表是一种基本且非常重要的数据结构,它是面试中的常见考察点。链表通常由节点组成,每个节点包含数据部分和指向下一个节点的指针,最后一个节点指向null。链表分为单链表、双链表、循环链表等...
#### 五、总结 本篇文章详细介绍了基于C语言实现的一个功能丰富的链表模型。通过上述介绍,我们可以看到链表作为一种灵活的数据结构,能够支持多种操作,包括但不限于节点的增删改查等。在实际编程过程中,合理利用...
根据提供的文件信息,这里将对链表相关的面试题目进行总结,并深入探讨其中涉及的数据结构与算法知识点。 ### 链表基础知识回顾 在讨论具体的面试题之前,我们首先需要了解链表的基本概念及其操作方法。链表是一种...
【链表题目总结1】 链表作为数据结构中的一种,其操作经常出现在编程面试和算法题目中。这里我们总结了几个关于链表的典型问题及其解题方法。 1. **返回倒数第k个节点** (剑指offer 22) - **方法一**:两次遍历法...
总结来说,循环链表和双向链表是链表结构的两种不同类型,它们在数据结构与算法领域中占据着重要地位。通过理解这些链表结构的基本概念和操作方法,可以在实际的编程和应用开发中处理更复杂的数据关系和操作逻辑。
静态链表和动态链表详细讲解教程 本资源讲解了链表的基本概念和实现...本资源总结了链表的基本概念和实现方式,着重介绍了静态链表和动态链表的区别和应用场景。链表是一种灵活和高效的数据结构,广泛应用于各种领域。
### 总结 本文详细介绍了单向链表的建立、显示、节点获取、插入和删除等关键操作。链表作为一种灵活的数据结构,其动态性使得在不连续的内存空间中也能高效地存储和管理数据,特别适合于数据量不确定或者频繁变化的...
城市链表是一种特殊的数据结构,通常用于模拟城市之间的道路连接,每个节点代表一个城市,而节点间的连接则代表城市间的交通线路。在这个“城市链表课程设计”中,你将有机会深入理解和实践这种数据结构的实现及其...
总结来说,链表是实现单片机多级菜单的理想工具,它提供了灵活的数据结构,使得菜单设计和操作变得更加便捷。通过理解链表的工作原理以及如何在多级菜单系统中运用它,开发者可以创建出高效、易维护的单片机应用程序...
总结来说,双链表提供了双向遍历的能力,循环链表在遍历和某些特定操作上具有优势,而静态链表则适用于数据元素数量固定且不支持指针的环境。理解和掌握这些链表类型及其操作,对于理解和编写高效的数据结构算法至关...
总结来说,单向链表是一种灵活的数据结构,其节点通过指针相互连接。通过定义结构体,我们可以创建链表节点,然后使用插入函数构建链表。遍历链表则允许我们访问并处理链表中的所有元素。了解和掌握这些基础知识是...
链表作为一种基础且重要的数据结构,在计算机科学中广泛应用于各种算法和程序设计中。逆置链表是一项常见的操作,它可以改变链表元素的顺序,使得原本的最后一个元素变为第一个,以此类推。本文将深入探讨如何用...
#### 六、总结 通过上述实现,我们已经成功地创建了一个单向链表,并实现了基本的操作。这些操作不仅有助于理解链表的工作原理,还可以作为实际项目的基础。需要注意的是,这里提供的代码仅作为一个简单的示例,并...
C语言中关于链表的总结内容,内附代码例题,详细的有条理的讲解链表内容