双链表的实现
1. 接口
package com.DS.DoubleLinked;
public interface ILinked {
void addFirst(Object data);
void addLast(Object data);
void addIndex(int index, Object data);
boolean contains(Object data);
Object remove(int index);
void removeAllKey(Object key);
Object get(int index);
Object set(int index, Object newData);
int getLength();
void display();
}
2. 实现类
package com.DS.DoubleLinked;
import java.util.Vector;
public class DoubleLikedImpl implements ILinked {
private Node head;
private Node last;
private int size;
private class Node {
private Node prev;
private Object data;
private Node next;
public Node(Node prev, Object data, Node next) {
this.prev = prev;
this.data = data;
this.next = next;
}
public Node(Object data) {
this.data = data;
}
}
@Override
public void addFirst(Object data) {
Node prev = head;
Node newNode = new Node(null, data, prev);
head = newNode;
if (prev == null) {
last = newNode;
} else {
prev.prev = newNode;
}
size++;
}
@Override
public void addLast(Object data) {
Node pred = this.last;
Node newNode = new Node(pred, data, null);
this.last = newNode;
if (pred == null) {
this.head = newNode;
} else {
pred.next = newNode;
}
this.size++;
}
private boolean isLinkIndex(int index) {
if (index < 0 || index > size) {
return false;
}
return true;
}
@Override
public void addIndex(int index, Object data) {
if(isLinkIndex(index)){
Node temp =node(index);
Node prev =temp.prev;
Node newData =new Node(prev,data,temp);
temp.prev=newData;
if(prev==null){
this.head=newData;
}else {
prev.next=newData;
}
size++;
}
}
@Override
public boolean contains(Object data) {
if (data == null) {
for (int i = 0; i <this.size; i++) {
if (node(i).data == null) {
return true;
}
}
} else {
for (int i = 0; i <this.size; i++) {
if (node(i).data.equals(data)) {
return true;
}
}
}
return false;
}
@Override
public Object remove(int index) {
if (isLinkIndex(index)) {
Node temp = node(index);
Object oldData = temp.data;
unLink(temp);
return oldData;
}
return null;
}
private Object unLink(Node x) {
Object elementData = x.data;
Node prev = x.prev;
Node next = x.next;
if(prev==null){
this.head=next;
}else {
prev.next=next;
x.prev=null;
}
if(next==null){
this.last=prev;
}else{
next.prev=prev;
x.next=null;
}
x.data=null;
this.size--;
return elementData;
}
@Override
public void removeAllKey(Object key) {
Node pred =this.head;
while (pred!=null){
Node prev =pred.prev;
Node next =pred.next;
if(pred.data==key){
if(prev==null){
this.head=next;
}else{
prev.next=next;
pred.prev=null;
}
if(next==null){
this.last=prev;
}else {
next.prev=prev;
pred.next=null;
}
pred.data=null;
size--;
pred=next;
}else {
pred=pred.next;
}
}
}
@Override
public Object get(int index) {
if(!isLinkIndex(index)){
return null;
}
return node(index).data;
}
@Override
public Object set(int index, Object newData) {
if(!isLinkIndex(index)){
return null;
}
Node node = node(index);
Object oldData = node.data;
node.data=newData;
return oldData;
}
@Override
public int getLength() {
return size;
}
@Override
public void display() {
for (int i = 0; i < this.size; i++) {
System.out.print(node(i).data);
}
System.out.println();
}
private Node node(int index) {
isLinkIndex(index);
if (index < (size >> 1)) {
Node temp = this.head;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
return temp;
}
Node temp = this.last;
for (int i = size - 1; i > index; i--) {
temp = temp.prev;
}
return temp;
}
}
3. 测试类
package com.DS.DoubleLinked;
public class TestDemo {
public static void main(String[] args) {
ILinked iLinked = new DoubleLikedImpl();
iLinked.addFirst(1);
iLinked.addFirst(2);
iLinked.addFirst(3);
iLinked.addIndex(1, 3);
iLinked.display();
iLinked.addLast(3);
iLinked.display();
System.out.println(iLinked.contains(3));
System.out.println(iLinked.getLength());
System.out.println(iLinked.contains(7));
System.out.println(iLinked.contains(3));
System.out.println(iLinked.contains(0));
iLinked.display();
System.out.println(iLinked.remove(1));
iLinked.display();
System.out.println(iLinked.set(2,8));
iLinked.display();
System.out.println(iLinked.set(0,7));
iLinked.display();
iLinked.addFirst(2);
iLinked.addLast(2);
iLinked.display();
iLinked.removeAllKey(2);
iLinked.display();
}
}