您的位置:首页 > 理论基础 > 数据结构算法

《Java数据结构与算法》笔记-CH5-链表-8实现双链表,头部和尾部插入和删除

2016-07-03 11:47 399 查看
/**
* 双向链表节点类
*/
class DoubleLinkNode {
public long data;// 数据
public DoubleLinkNode next;// next指针
public DoubleLinkNode previous;// previous指针

public DoubleLinkNode(long d) {
this.data = d;
}

public String toString() {
return String.valueOf(data);
}
}

/**
* 双向链表
*/
class DoubleLinkList {
private int size;
private DoubleLinkNode first;// 头节点
private DoubleLinkNode last;// 尾节点

public DoubleLinkList() {
this.size = 0;
this.first = null;
this.last = null;
}
@Override
public String toString() {
if(isEmpty()) return "[]";
StringBuilder sb = new StringBuilder();
sb.append("[");
DoubleLinkNode current = first;
for(int i=0;i<size; i++){
sb.append(current.toString()).append(",");
current = current.next;
}
sb.deleteCharAt(sb.length()-1);
sb.append("]");
return sb.toString();
}
public boolean isEmpty() {
return first == null;
}

// 在链表头部插入节点
public void insertFirst(DoubleLinkNode d) {
if (isEmpty())// 如果链表为空,尾节点指向新节点
last = d;
else// 不空的话,头节点的previous指针指向新节点
first.previous = d;
d.next = first;// 新节点的next指针指向头结点
first = d;// 头结点指向新节点
size += 1;
}

// 在尾部插入节点
public void insertLast(DoubleLinkNode d) {
if (isEmpty())// 如果链表为空,头结点指向新节点
first = d;
else {// 如果不为空,尾节点的next指针指向新节点,新节点的previous指针指向原尾节点
last.next = d;
d.previous = last;
}
last = d;// 尾节点指向新节点
size += 1;
}

// 从头部删除节点
public DoubleLinkNode deleteFirst() {
DoubleLinkNode temp = first;// 先将头部节点存放到temp变量中
if (first.next == null)// 如果头结点的next指针为空,也就是链表为空
last = null;// 尾节点置空
else// 如果链表不为空
first.next.previous = null;// 头结点next指向的节点的previous指向空
first = first.next;// 头结点指向原头结点的next指向的节点
size -= 1;
return temp;// 返回存下来的temp节点
}

// 从尾部删除节点
public DoubleLinkNode deleteLast() {
DoubleLinkNode temp = last;
if (first.next == null)
first = null;
else
last.previous.next = null;
last = last.previous;
size -= 1;
return temp;
}
/**
* 通过key值找到节点,在后面插入新节点
* @param key
* @param d
* @return
*/
public boolean insertAfter(long key, DoubleLinkNode d) {
DoubleLinkNode current = first;
//找到key对应的节点,找不到返回false
while (current.data != key) {
current = current.next;
if (current == null)
return false;
}
//找到的节点是最后一个节点,就在尾部插入
if (current == last) {
d.next = null;//新节点的next置空
last = d;//原尾节点指向新节点
} else {//找到的节点不是尾节点节点
d.next = current.next;
current.next.previous = d;
}
d.next.previous = current;
current.next = d;
size += 1;
return true;
}
}

public class DoublyLinkedDemo {
public static void main(String[] args) {
DoubleLinkList dll = new DoubleLinkList();
for(int i=0; i<5; i++){
long l = (long)(Math.random()*1000);
DoubleLinkNode node = new DoubleLinkNode(l);
System.out.print("生成随机节点:"+node.toString());
dll.insertFirst(node);
System.out.println(",从头部插入,此时链表为"+dll.toString());
}
while(!dll.isEmpty()){
System.out.println("删除头结点:" + dll.deleteFirst()+",此时链表为:"+dll.toString());
}
for(int i=0; i<5; i++){
long l = (long)(Math.random()*1000);
DoubleLinkNode node = new DoubleLinkNode(l);
System.out.print("生成随机节点:"+node.toString());
dll.insertLast(node);
System.out.println(",从尾部插入,此时链表为"+dll.toString());
}
while(!dll.isEmpty()){
System.out.println("删除尾结点:" + dll.deleteLast()+",此时链表为:"+dll.toString());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 数据结构 算法