基础知识:
线性表(linear list),是其组成元素间具有线性关系的一种线性结构。
线性表有
①顺序存储结构(sequential storage structure)
顺序存储结构可以简单的理解利用为 数组 的形式来进行保存数据。
②链式存储结构(chained storage structure)
链式存储结构中包括 单链表 和 双链表
注意:顺序数组必须保证逻辑关系(logical relationship)和存储关系(storage relationship)必须连续。
双链表的每个结点都有两个地址域,分别指向它的前驱结点和后继结点,结构如下:
我们一般都构造循环链表,下面是双向循环链表的代码:
package practice;
import java.util.*;
//设置结点
class Node{
public int data; //构造简单的数据域
public Node prev,next; //构造前驱和后继
//构造函数(可不用)
public Node(int data, Node prev, Node next) {
this.data = data;
this.prev = prev;
this.next = next;
}
public Node() {
}
}
public class Line {
//******创建链表
public static Node creat(int n) {
Scanner input = new Scanner(System.in);
Node head = new Node(input.nextInt(),null,null); //设置头指针
Node q = head;
for(int i = 1; i <n; i++) {
Node p = new Node(input.nextInt(),null,null);
if(head == null) {
head.data = i;
}
else {
q.next = p;
p.prev = q;
q = q.next;
}
}
q.next = head; //首尾相连,构成循环
head.prev = q;
return head;
}
//*****长度计时器
public static int length(Node head) {
Node p = head;
Node q = head.next;
int l = 1;
while(p != q) {
q = q.next;
l++;
}
return l;
}
//*****链表的遍历
public static void Traversal(Node head) {
Node p = head;
Node q = head.next;
System.out.print(p.data+"\t");
while(p != q) {
System.out.print(q.data+"\t");
q = q.next;
}
}
//*****链表的添加,尾插入法
public static Node add(Node head,int n,int data) {
int count = 1;
Node p = head.next;
while(count < n-1) {
p = p.next;
count++;
}
Node q = new Node(data,null,null);
p.next.prev = q;
q.next = p.next;
q.prev = p;
p.next = q;
return head;
}
//删除与添加类似,暂不表
public static void main(String[] args) {
//测试,七个结点
System.out.println("输入七个数据");
Node head = creat(7);
System.out.println("长度为:"+length(head));
System.out.println("遍历:");
Traversal(head);
System.out.println();
System.out.println("下面是向第五位插入数据20之后的遍历");
Traversal(add(head,5,20));
}
}
下面是测试数据:
输入特殊数据时:
当双向链表不是循环的时候,它的结构图为:
当双向链表为双向循环时,它的head的prev与最后一个结点连接起来即可。
双向和单向链表相比有以下优势:
1.插入删除不需要移动元素外,可以原地插入删除
2.可以双向遍历
3.不用担心head丢失导致的数据丢失