数据结构基础-------2.线性表之双向循环链表的创建与输出方法(Java版)

基础知识:

线性表(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丢失导致的数据丢失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值