目录
定义一个双向链表
public class DoubleLinkedList {
// 当前链表中有效的元素个数
private int size;
// 头节点
private Node head;
// 尾节点
private Node tail;
}
定义双向链表的节点类
/**
* 双链表的节点类
*/
class Node {
//前驱节点
Node prev;
//保存具体值
int val;
//后继节点
Node next;
public Node(int val) {
this.val = val;
}
public Node(Node prev, int val, Node next) {
this.prev = prev;
this.val = val;
this.next = next;
}
}
增
-
头插法
/**
* 头插法
* @param val
*/
public void addFirst(int val){
Node node = new Node(null,val,head);
if (head == null){
tail = node;
}else{
head.prev = node;
}
head = node;
size++;
}
-
尾插法
/**
* 尾插法
* @param val
*/
public void addLast(int val){
Node node = new Node(tail,val,null);
if (tail == null){
head = node;
}else {
tail.next = node;
}
tail = node;
size++;
}
-
根据索引插入
/**
* 在index位置插入节点
* @param val
*/
public void addIndex(int index,int val) {
if (index<0 || index>size) {
System.err.println("索引非法!");
return;
} else if (index == 0) addFirst(val);
else if (index == size) addLast(val);
else {
Node prev = findNode(index - 1);
Node newNode = new Node(prev,val,prev.next);
prev.next.prev = newNode;
prev.next = newNode;
size++;
}
}
-
测试
/**
* @author happy
*/
public class Test {
public static void main(String[] args) {
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
doubleLinkedList.addFirst(1);
doubleLinkedList.addFirst(2);
doubleLinkedList.addLast(3);
doubleLinkedList.addLast(4);
//2->1->3->4->null
System.out.println(doubleLinkedList);
doubleLinkedList.addIndex(0,5);
doubleLinkedList.addIndex(2,7);
doubleLinkedList.addIndex(6,9);
//5->2->7->1->3->4->9->null
System.out.println(doubleLinkedList);
}
}
找到index位置的节点----二分法
/**
* 找到index索引对应的节点,使用二分查找
* @param index
* @return index对应的节点Node
*/
private Node findNode(int index) {
Node ret = null;
if(index < (size >> 1)){
ret = head;
for (int i = 0; i <index ; i++) {
ret = ret.next;
}
}else {
ret = tail;
for (int i = size-1; i > index ; i--) {
ret = ret.prev;
}
}
return ret;
}
toString()方法
public String toString(){
String ret = "";
Node node = head;
while (node != null){
ret += node.val + "->";
node = node.next;
}
ret += null;
return ret;
}