数据结构_双向链表

节点定义

public class Node {
	Node previous;
	Node next;
	Object element;

	public Node(Node previous, Node next, Object element) {
		super();
		this.previous = previous;
		this.next = next;
		this.element = element;
	}

	public Node(Object element) {
		super();
		this.element = element;
	}
}

双向链表定义

属性

public class MyLinkedList<E> {

	private Node first;
	private Node last;

	private int size;
	
	@Override
	public String toString() {

		StringBuilder sb = new StringBuilder("[");
		Node temp = first;
		while (temp != null) {
			sb.append(temp.element + ",");
			temp = temp.next;
		}
		sb.setCharAt(sb.length() - 1, ']');
		return sb.toString();
	}
}

索引越界检查

private void checkRange(int index) {
	if (index < 0 || index > size ) {
		throw new RuntimeException("索引不合法:" + index);
	}
}

查询指定索引节点

private Node getNode(int index) {
	checkRange(index);
	if (index < (size >> 1)) {
		Node temp = first;
		for (int i = 0; i < index; i++) {
			temp = temp.next;
		}
		return temp;
	} else {
		Node temp = last;
		for (int i = size - 1; i > index; i--) {
			temp = temp.previous;
		}
		return temp;
	}
}

末尾增加

public void add(E element) {
	Node node = new Node(element);
	if (first == null) {
		first = node;
		last = node;
	} else {
		node.previous = last;
		node.next = null;
		last.next = node;
		last = node;
	}
	size++;
}

索引位置增加

public void add(E element, int index) {

	Node newNode = new Node(element);
	Node temp = getNode(index);

	if (temp != null) {
		if (index == 0) {
			first = newNode;
			newNode.next = temp;
			temp.previous = newNode;
		} else if (index == size) {
			last = newNode;
			temp.next = last;
			last.previous = temp;
		} else {
			temp.previous.next = newNode;
			newNode.previous = temp.previous;

			newNode.next = temp;
			temp.previous = newNode;
		}
		size++;
	}
}

查询

public E get(int index) {
	checkRange(index);
	Node temp = getNode(index);
	return temp != null ? (E) temp.element : null;
}

删除

public void remove(int index) {
	checkRange(index);

	Node temp = getNode(index);

	if (temp != null) {
		if (index == 0) {
			first = temp.next;
		} else if (index == size - 1) {
			last = temp.previous;
		} else {
			temp.previous.next = temp.next;
			temp.next.previous = temp.previous;
		}
		size--;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值