首页 > 编程语言 > 详细

Java数据结构——双向链表

时间:2019-03-02 00:56:35      阅读:234      评论:0      收藏:0      [点我收藏+]

什么是双向链表?
每一个结点不仅配有next引用,同时还有一个prev引用,指向其上一个结点(前驱结点), 没有前驱的时候就为NULL。

技术分享图片

(以下图片均来自网络,侵删)

 

与单链表的区别?
和单向链表相比有以下优势:

  1. 插入删除不需要移动元素外,可以原地插入删除
  2. 可以双向遍历

 

插入操作

技术分享图片

 

删除操作

技术分享图片

 

实现

public class DLNode {
Object data;
DLNode prev;
DLNode next;
static DLNode head;
static DLNode tail;

// 无参构造
public DLNode() {
super();
}

// 有参构造
public DLNode(Object data, DLNode prev, DLNode next) {
super();
this.data = data;
this.prev = prev;
this.next = next;
}

// 获取数据
public Object getData() {
return data;
}

// 修改数据
public void setData(Object data) {
this.data = data;
}

// 得到前驱结点
public DLNode getPrev() {
return prev;
}

// 修改前驱结点
public void setPrev(DLNode prev) {
this.prev = prev;
}

// 获取后驱结点
public DLNode getNext() {
return next;
}

// 修改后驱结点
public void setNext(DLNode next) {
this.next = next;
}

// 获取长度
public static int getLength() {
int count = 0;
for (DLNode n = head; n != null; n = n.next) {
count++;
}
return count;
}

// 插入结点
public static void add(Object data, int index) {
DLNode node = new DLNode(data, null, null);
if (index == 0) {
node.next = head;
node.prev = null;
head = node;
} else if (index == getLength()) {
tail.next = node;
node.prev = tail;
tail = node;

} else {
int temp = 0;
for (DLNode n = head; n != null; n = n.next) {
temp++;
if (temp == index) {
node.next = n.next;
n.next.prev = node;
n.next = node;
node.prev = n;
break;
}
}
}
}

//删除结点
public static void remove(int index) {
if (index == 0) {
head = head.next;
head.prev = null;
} else if (index == getLength() - 1) {
tail = tail.prev;
tail.next = null;
} else if (index >= getLength()) {
System.out.println("超出链表长度");
System.exit(0);
} else {
int temp = 0;
for (DLNode n = head; n != null; n = n.next) {
temp++;
if (temp == index) {
n.next = n.next.next;
n.next.prev = n;
break;
}
}
}
}

public static void main(String[] args) {
DLNode node1 = new DLNode("aaa", null, null);
DLNode node2 = new DLNode("bbb", node1, null);
DLNode node3 = new DLNode("ccc", node2, null);
DLNode node4 = new DLNode("ddd", node3, null);
node3.setNext(node4);
node2.setNext(node3);
node1.setNext(node2);
head = node1;
tail = node4;
System.out.print("当前链表:");
for (DLNode n = head; n != null; n = n.next) {
System.out.print(n.data + " ");
}
System.out.println();
System.out.println("链表长度:" + getLength());
add("eee", 4);
System.out.print("插入后链表:");
for (DLNode n = head; n != null; n = n.next) {
System.out.print(n.data + " ");
}
System.out.println();
remove(0);
System.out.print("删除后链表:");
for (DLNode n = head; n != null; n = n.next) {
System.out.print(n.data + " ");
}
}
}

  

Java数据结构——双向链表

原文:https://www.cnblogs.com/ericz2j/p/10459356.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!