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

/**
 * 双向链表节点类
 */
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());
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值