Java實現雙鏈表
阿新 • • 發佈:2018-12-19
一、連結串列實現結構
一個介面ILink 一個linkImpl類實現介面 LinkImpl中封裝一個內部類Node來實現連結串列的掛載
1.介面
interface ILink{ void add(Object data); boolean remove(Object data); int contains(Object data); void clear (Object data); Object set(int index,Object newData); Object get(int index); int size(); Object[] toArray(); void printList(); }
2.LinkImpl類
class linkImpl implements ILink{ private Node first; private Node last; int size = 0; 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; } } @Override public void clear(Object data){ } @Override public void add(Object data) { } @Override public boolean remove(Object data) { } @Override public int contains(Object data) { } @Override public Object set(int index, Object newData) { } @Override public Object get(int index) { } @Override public int size() { } @Override public Object[] toArray() { } @Override public void printList() { } }
二、方法實現
1.新增節點
public void add(Object data) { Node temp = this.last; Node newNode = new Node(temp, data, null); this.last = newNode; if (this.first == null) { this.first = newNode; } else { temp.next = newNode; } this.size++; }
2.刪除指定節點
public boolean remove(Object data) {
if(data == null){
for(Node temp = this.first;temp!= null;temp = temp.next){
if(temp.data == null){
//刪除
unLink(temp);
return true;
}
}
}else{
for(Node temp = this.first;temp!=null;temp=temp.next){
if(data.equals(temp.data)){
//刪除
unLink(temp);
return true;
}
}
}
return false;
}
//返回刪之前的物件
private Object unLink(Node x){
Object elementData = x.data;
Node prev = x.prev;
Node next = x.next;
if(prev == null){
this.first = 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;
}
3.清空連結串列
public void clear(Object data){
for(Node x = this.first;x!= null;){
Node temp = x.next;
x.prev = x.next = null;
x = temp;
}
this.first = this.last = null;
size = 0;
}
4.判斷一個物件是否存在於該連結串列
public int contains(Object data) {
if(data == null){
int index = 0;
for(Node x = this.first;x.data != null;x = x.next){
if(x.data == null){
return index;
}
index ++;
}
return -1;
}
else{
int index = 0;
for(Node x = this.first;x.data != null;x=x.next){
if(data.equals(x.data)){
return index;
}
index++;
}
return -1;
}
}
5. set和get方法
public Object set(int index, Object newData) {
if(!isLinkElement(index)){
return null;
}
Node node = node(index);
node.data = newData;
return node;
}
public Object get(int index) {
if(!isLinkElement(index)){
return null;
}
return node(index).data;
}
輔助方法
private Node node(int index){
if(index<(size>>1)){
Node result = this.first;
for(int i = 0;i<index;i++){
result = result.next;
}
return result;
}
Node result = this.last;
for(int i = size-1; i>index;i--){
result = result.prev;
}
return result;
}
private boolean isLinkElement(int index){
return (index >=0) && (index<this.size);
}
6.求連結串列長度
public int size() {
return this.size;
}
7.將連結串列轉為物件陣列
public Object[] toArray() {
Object[] result = new Object[size];
int i = 0;
for(Node temp = this.first;temp!=null;temp = temp.next){
result[i++] = temp.data;
}
return result;
}
8.列印連結串列
public void printList() {
Object[] result = this.toArray();
for(Object obj:result){
System.out.println(obj);
}
}