双向链表 1.链表的结点
class Node{ //结点 public int data; public Node prev; public Node next; public Node() { this.data = data; } public Node(int data) { this.data = data; } }2.链表头插
public class DoubleList { //双向链表,不循环 private Node head;//头结点 private Node last;//尾结点 public DoubleList(){ this.head = null; this.last = null; } public void addFirst(int elem){ Node node = new Node (elem); if (head == null){ head = node; last = node; return; } node.next = head; head.prev = node; head = node; } }3.尾插
public void addLast(int elem){ Node node = new Node(elem); if (head == null){ head = node; last = node; return; } last.next = node; node.prev = last; last = node; }4.指定位置插入
public void addIndex(int index, int elem){ if (index < 0 || index > size()){ return; } if (index == 0){ addFirst(elem); return; } if(index == size()){ addLast(elem); return; } Node node = new Node(elem); Node next = search(index);//找出该位置的结点,将给定的结点插入该位置之前 Node prev = next.prev; node.next = next; next.prev = node; prev.next = node; node.prev = prev; }5.是否包含某元素
public boolean contains(int key){ Node cur = this.head; while (cur != null){ if (cur.data == key){ return true; } cur = cur.next; } return false; }6.删除给定元素
public void remove(int key){ Node cur = this.head; while (cur != null){ if (cur.data == key){ if (cur == this.head){ head = head.next; head.prev = null; return;//返回 }else{ if(cur.next != null){ cur.next.prev = cur.prev; cur.prev.next = cur.next; }else{ cur.prev.next = null; last = cur.prev; } } return;//返回 } cur = cur.next; } }7.删除给定值所有结点
public void removeAllKey(int key){ //删除给定值的所有结点 Node cur = this.head; while (cur != null){ if (cur.data == key){ if (cur == head){ head = head.next; if(head != null){ //防止全部删除时空指针异常 head.prev = null; } }else{ if (cur.next != null){//防止删除最后一个结点时空指针异常 cur.prev.next = cur.next; cur.next.prev = cur.prev; }else{ cur.prev.next = null; last = cur.prev; } } } cur = cur.next; } }相比较6,这里只用删掉return,让cur遍历完链表。
8.清空链表
public void clear(){ Node cur = this.head; while (cur != null){ //切断所有结点的联系 Node curNext = cur.next; cur.next = null; cur.prev = null; cur = curNext; } this.head = null; this.last = null; }9.打印链表
public void display(){ //打印链表 Node cur = this.head; while (cur != null){ System.out.print(cur.data + " "); cur = cur.next; } System.out.println(); }10.链表长度
private int size(){ //链表的长度 Node cur = this.head; int size = 0; while (cur != null){ size++; cur = cur.next; } return size; }11.查找给定位置的元素
private Node search(int index){ //查找某位置元素 Node cur = this.head; for (int i = 0; i < index; i++){ //与单链表不同,不用-1(不用找该位置的前一个结点) cur = cur.next; } return cur; }12.在test中测试
public class testDoubleList { public static void main(String[] args) { addF(); } public static void addF(){ DoubleList list = new DoubleList(); list.addLast(4); list.addLast(4); list.addLast(3); list.addLast(4); list.addLast(1); list.addLast(4); list.addLast(4); list.removeAllKey(4); list.display(); } }