双链表的实现

package boluo;

public class Test2 {
	public static void main(String[] args) {
		LinkedList link = new LinkedList();

		link.add("123456");
		link.add("456789");
		link.add("boluo");
		link.add("chuixue");

		link.delete(3);
		System.out.println(link);

	}
}

//双链表,由节点组成,节点用内部类来表示
class LinkedList {

	int size = 0;   //节点个数
	Node first;     //头节点
	Node last;      //尾节点

	static class Node {     //里面分三部分,数据,存储上一个节点的数据,存储下一个节点的数据
		String data;
		Node prev;
		Node next;

		public Node(String data, Node prev, Node next) {
			this.data = data;
			this.prev = prev;
			this.next = next;
		}
	}

	// 到此链表的组成元素就声明完成,接下来把这些组件连接到一块

	// 下标越界问题
	public void isout(int index) {
		if (index < 0 || index >= size) {
			throw new IllegalArgumentException("Index" + index);
		}
	}

	// 添加元素, 传入的是数据data, 如果链表中没有节点,就作为头节点,否则的话就添加到最后边
	public void add(String str) {

		// 新建的节点作为新传入的数据
		Node node = new Node(str, null, null);

		if (size == 0) {        //节点个数为0,就要把这个数据当作头节点
			this.first = node;
			this.last = node;
		} else {             //里面原本有节点的话,就要放到末尾
			this.last.next = node;
			node.prev = this.last;      //这时候this.last还是老的尾节点,所以把它放到新的为节点的prev中
			this.last = node;           //这时候才真正把尾节点设置为新添加进来的节点
		}
		size++;
	}


	// 根据下标找到指定的节点
	public Node getNode(int index) {
		//相当于复制了一个头节点,然后遍历到index位置,把index处的节点取出来
		Node no = this.first;       //复制头节点,不会影响原来的链
		for (int i = 0; i < index; i++) {
			no = no.next;
		}
		return no;
	}

	// 插入元素
	public void insert(int index, String data) {
		isout(index);       //判断下标是否越界

		// 新建节点来接收传入的新数据
		Node node = new Node(data, null, null);

		if (index == 0) {       //插入到头节点前面的位置
			this.first.prev = node;
			node.next = this.first;     //此时this.first还是老的头节点
			this.first = node;          //这时候才把头节点正式改为新的传进来的节点
		} else if (index == size) {    //插入到尾节点的后面
			this.last.next = node;
			node.prev = this.last;
			this.last = node;
		} else {     //插入到中间的位置
			//要先找到插入到他前面的那个节点
			Node no = getNode(index);       //新节点要插入到no的前面
			no.prev.next = node;
			node.prev = no.prev;

			node.next = no;
			no.prev = node;
		}
		size++;
	}


	// 根据下标进行删除
	public void delete(int index) {
		isout(index);

		if (index == 0) {       //删除头节点
			this.first.next.prev = null;        //先让第二个节点的prev指为null
			this.first = this.first.next;
		} else if (index == size - 1) {      //删除尾节点
			this.last.prev.next = null;
			this.last = this.last.prev;
		} else {     //删除中间的节点
			//先找到要删除的元素的下标
			Node no = getNode(index);
			no.next.prev = no.prev;
			no.prev.next = no.next;
		}
		size--;

	}

	public String toString() {

		//遍历节点, 依次拼接真实值
		StringBuilder sb = new StringBuilder("[");
		Node no = this.first;
		for (int i = 0; i < size; i++) {
			sb.append(no.data).append(", ");
			no = no.next;
		}

		// 转换字符串
		String str = sb.toString();

		// 判断size是否为0
		if (size > 0)
			str = str.substring(0, str.length() - 2);

		// 返回
		return str + "]";
	}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值