1.双端链表MyLinkedDeque实例
package com.hooware.mylinked;
public class MyLinkedDeque<E> {
private int size;
private Node head;
private Node tail;
class Node {
E val;
Node pre;
Node next;
public Node() {
}
public Node(E val) {
this.val = val;
}
}
public MyLinkedDeque() {
head = new Node();
tail = new Node();
head.next = tail;
tail.pre = head;
}
public int getSize() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public void addFirst(E value) {
Node node = new Node(value);
Node temp = head.next;
head.next = node;
node.pre = head;
node.next = temp;
temp.pre = node;
size++;
}
public void addLast(E value) {
Node node = new Node(value);
Node temp = tail.pre;
tail.pre = node;
node.next = tail;
node.pre = temp;
temp.next = node;
size++;
}
public void add(E value, int index) {
if (index <= 0) {
addFirst(value);
return;
}
if (index >= size) {
addLast(value);
return;
}
Node node = new Node(value);
Node cur = head;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
Node temp = cur .next;
cur.next = node;
node.pre = cur;
node.next = temp;
temp.pre = node;
size++;
}
public E getFirst() {
Node cur = head.next;
if (cur == null) {
return null;
}
return cur.val;
}
public E getLast() {
Node cur = tail.pre;
if (cur == null) {
return null;
}
return cur.val;
}
public E removeFirst() {
Node cur = head.next;
if (cur.next == null) {
return null;
}
E value = cur.val;
cur.pre.next = cur.next;
cur.next.pre = cur.pre;
size--;
return value;
}
public E removeLast() {
Node cur = tail.pre;
if (cur.pre == null) {
return null;
}
E value = cur.val;
cur.pre.next = cur.next;
cur.next.pre = cur.pre;
size--;
return value;
}
public E remove(int index) {
if (index <= 0) {
return removeFirst();
}
if (index >= size) {
return removeLast();
}
Node cur = head;
for (int i = 0; i <= index; i++) {
cur = cur.next;
}
E value = cur.val;
cur.pre.next = cur.next;
cur.next.pre = cur.pre;
size--;
return value;
}
public E updateFirst(E val) {
Node cur = head.next;
if (cur.next == null) {
return null;
}
E value = cur.val;
cur.val = val;
return value;
}
public E updateLast(E val) {
Node cur = tail.pre;
if (cur.pre == null) {
return null;
}
E value = cur.val;
cur.val = val;
return value;
}
public E update(E val, int index) {
if (index <= 0) {
return updateFirst(val);
}
if (index >= size) {
return updateLast(val);
}
Node cur = head.next;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
E value = cur.val;
cur.val = val;
return value;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("MyLinkedList size is " + size + " !");
if (size > 0) {
sb.append(" head : ");
}
Node cur = head.next;
while (cur != null) {
if (cur.next == null) {
sb.append(" : tail");
cur = cur.next;
continue;
}
if (cur.next.next == null) {
sb.append(cur.val);
cur = cur.next;
continue;
}
sb.append(cur.val + "<==>");
cur = cur.next;
}
return sb.toString();
}
}
2.测试双端链表实例demo
package com.hooware.mylinked;
import org.junit.Before;
import org.junit.Test;
public class MylInkedDequeDemo {
private MyLinkedDeque<Integer> linkedDeque;
@Before
public void init() {
linkedDeque = new MyLinkedDeque<>();
linkedDeque.addLast(2);
linkedDeque.addFirst(1);
linkedDeque.addLast(3);
linkedDeque.addLast(4);
linkedDeque.add(5,3);
}
@Test
public void testAdd() {
linkedDeque.addLast(2);
linkedDeque.addFirst(1);
linkedDeque.addLast(3);
linkedDeque.addLast(4);
linkedDeque.add(5,3);
System.out.println(linkedDeque);
}
@Test
public void testGet() {
System.out.println(linkedDeque);
System.out.println(linkedDeque.getFirst());
System.out.println(linkedDeque.getLast());
}
@Test
public void testRemoveFirst() {
System.out.println(linkedDeque);
Integer value = linkedDeque.removeFirst();
System.out.println(value);
System.out.println(linkedDeque);
System.out.println(linkedDeque.removeFirst());
System.out.println(linkedDeque.removeFirst());
System.out.println(linkedDeque.removeFirst());
System.out.println(linkedDeque);
System.out.println(linkedDeque.removeFirst());
System.out.println(linkedDeque.removeFirst());
System.out.println(linkedDeque.removeFirst());
System.out.println(linkedDeque);
}
@Test
public void testRemoveLast() {
System.out.println(linkedDeque);
Integer value = linkedDeque.removeLast();
System.out.println(value);
System.out.println(linkedDeque);
System.out.println(linkedDeque.removeLast());
System.out.println(linkedDeque.removeLast());
System.out.println(linkedDeque.removeLast());
System.out.println(linkedDeque);
System.out.println(linkedDeque.removeLast());
System.out.println(linkedDeque.removeLast());
System.out.println(linkedDeque.removeLast());
System.out.println(linkedDeque);
}
@Test
public void testRemove() {
System.out.println(linkedDeque);
System.out.println(linkedDeque.remove(3));
System.out.println(linkedDeque);
System.out.println(linkedDeque.remove(2));
System.out.println(linkedDeque);
System.out.println(linkedDeque.remove(1));
System.out.println(linkedDeque);
System.out.println(linkedDeque.remove(1));
System.out.println(linkedDeque.remove(1));
System.out.println(linkedDeque.remove(1));
}
@Test
public void testUpdateFirstAndLast() {
System.out.println(linkedDeque);
System.out.println(linkedDeque.updateFirst(100));
System.out.println(linkedDeque);
System.out.println(linkedDeque.updateLast(200));
System.out.println(linkedDeque);
}
@Test
public void testUpdate() {
System.out.println(linkedDeque);
System.out.println(linkedDeque.update(100, 2));
System.out.println(linkedDeque);
System.out.println(linkedDeque.update(200,9));
System.out.println(linkedDeque);
}
}