创建一个双向链表的节点:
class ListNode {
public int val;
public ListNode next = null;
public ListNode prev = null;
public ListNode(int val) {
this.val = val;
}
}
关于头插:
public void addFirst(int date){
ListNode newNode = new ListNode(date);
ListNode next = head.next;
head.next = newNode;
newNode.next = next;
next.prev = newNode;
newNode.prev = head;
}
如何将链表打印出来
public void display(){
System.out.println("单向");
System.out.print("[");
for(ListNode cur = head.next ;cur != head; cur = cur.next){
System.out.print(cur.val);
if(cur.next != head){
System.out.print(",");
}
}
System.out.println("]");
System.out.println("反向");
System.out.print("[");
for (ListNode cur = head.prev ; cur != head;cur = cur.prev){
System.out.print(cur.val);
if(cur.prev != head){
System.out.print(",");
}
}
System.out.println("]");
}
尾插(重点是找到prev)
public void addLast(int date){
ListNode newNode = new ListNode(date);
ListNode prev = head.prev;
prev.next = newNode;
newNode.next = head;
newNode.prev = prev;
head.prev = newNode;
}
头插尾插复杂度都是O(1)
总代码如下:
class ListNode {
public int val;
public ListNode next = null;
public ListNode prev = null;
public ListNode(int val) {
this.val = val;
}
}
public class Dlinklist {
ListNode head ;
public Dlinklist(){
head = new ListNode(-1);
head.next = head;
head.prev = head;
}
public void addFirst(int date){
ListNode newNode = new ListNode(date);
ListNode next = head.next;
head.next = newNode;
newNode.next = next;
next.prev = newNode;
newNode.prev = head;
}
public void addLast(int date){
ListNode newNode = new ListNode(date);
ListNode prev = head.prev;
prev.next = newNode;
newNode.next = head;
newNode.prev = prev;
head.prev = newNode;
}
public void display(){
System.out.println("正向");
System.out.print("[");
for(ListNode cur = head.next ;cur != head; cur = cur.next){
System.out.print(cur.val);
if(cur.next != head){
System.out.print(",");
}
}
System.out.println("]");
System.out.println("反向");
System.out.print("[");
for (ListNode cur = head.prev ; cur != head;cur = cur.prev){
System.out.print(cur.val);
if(cur.prev != head){
System.out.print(",");
}
}
System.out.println("]");
}
public void addIndex(int index , int date){
int size = size();
if(index < 0 || index > size){
return;
}
if(index == 0){
addFirst(date);
return;
}
if(index == size){
addLast(date);
}
ListNode next = getPos(index);
ListNode prev = next.prev;
ListNode newNode = new ListNode(date);
newNode.next = next;
next.prev = newNode;
prev.next = newNode;
newNode.prev = prev;
}
public boolean contains(int toFind){
for(ListNode cur = head.next; cur != head; cur = cur.next){
if(cur.val == toFind){
return true;
}
}
return false;
}
public void remove(int key){
ListNode toRemove = tofind(key);
if(toRemove == null){
//没有找到删除的元素。
return;
}
ListNode next = toRemove.next;
ListNode prev = toRemove.prev;
prev.next = next;
next.prev = prev;
}
public void removeAll(int key){
while (true) {
ListNode toRemove = tofind(key);
if(toRemove == null){
return;
}
ListNode next = toRemove.next;
ListNode prev = toRemove.prev;
prev.next = next;
next.prev = prev;
}
}
public ListNode tofind(int key){
for (ListNode cur = head.next ; cur != head; cur = cur.next){
if (cur.val == key){
return cur;
}
}
return null;
}
public ListNode getPos(int index){
ListNode cur = head.next;
for(int i = 0; i < index;i++){
cur = cur.next;
}
return cur;
}
public int size(){
int size = 0;
for(ListNode cur = head.next; cur != head; cur = cur.next){
size++;
}
return size;
}
public void claer(){
head.next = head;
head.prev = head;
}
}
测试代码:
public class Test {
public static void main(String[] args){
testAddFirst();
testAddLast();
testAddIndext();
testContains();
testRemove();
testRemoveAll();
}
public static void testAddFirst(){
Dlinklist dLinklist = new Dlinklist();
System.out.println("测试addFirst方法");
dLinklist.addFirst(1);
dLinklist.addFirst(2);
dLinklist.addFirst(3);
dLinklist.addFirst(4);
dLinklist.display();
}
public static void testAddLast(){
Dlinklist dlinklist = new Dlinklist();
System.out.println("测试addLast方法");
dlinklist.addLast(1);
dlinklist.addLast(2);
dlinklist.addLast(3);
dlinklist.addLast(4);
dlinklist.display();
}
public static void testAddIndext(){
Dlinklist dlinklist = new Dlinklist();
System.out.println("测试addIndex方法");
dlinklist.addLast(1);
dlinklist.addLast(2);
dlinklist.addLast(3);
dlinklist.addLast(4);
dlinklist.addIndex(2,100);
dlinklist.display();
}
public static void testContains(){
Dlinklist dlinklist = new Dlinklist();
System.out.println("测试contains方法");
dlinklist.addLast(1);
dlinklist.addLast(2);
dlinklist.addLast(3);
dlinklist.addLast(4);
dlinklist.display();
boolean result = dlinklist.contains(5);
System.out.println(result);
}
public static void testRemove(){
Dlinklist dlinklist = new Dlinklist();
System.out.println("测试remove方法");
dlinklist.addLast(1);
dlinklist.addLast(2);
dlinklist.addLast(3);
dlinklist.addLast(4);
dlinklist.remove(1);
dlinklist.display();
}
public static void testRemoveAll(){
Dlinklist dlinklist = new Dlinklist();
System.out.println("测试removeAll方法");
dlinklist.addLast(1);
dlinklist.addLast(2);
dlinklist.addLast(3);
dlinklist.addLast(4);
dlinklist.addLast(4);
dlinklist.addLast(4);
dlinklist.display();
dlinklist.removeAll(4);
dlinklist.display();
}
}