package Test;
import java.util.Currency;
import javax.management.loading.PrivateClassLoader;
import javax.print.attribute.Size2DSyntax;
import javax.xml.soap.Node;
import javax.xml.transform.Templates;
interface Link{
void add(Object obj);
boolean remove(int index);
boolean contains(Object obj);
int indexOf(Object obj);
boolean set(int index,Object obj);
Object get(int index);
int length();
void clear();
Object[] toArray();
void printLink();
}
class Factory{
private Factory(){}
public static Link getLinkInstance() {
return new LinkImpl();
}
}
class LinkImpl implements Link{
private int size = 0;
private Node first;
private Node last;
public Node getFirst() {
return first;
}
public void setFirst(Node first) {
this.first = first;
}
public Node getLast() {
return last;
}
public void setLast(Node last) {
this.last = last;
}
public class Node{
private Node prev;
private Object data;
private Node next;
private Node(Node prev,Object data,Node next){
this.prev = prev;
this.data = data;
this.next = next;
}
}
public void add(Object obj) {
Node cur = this.last;
Node newNode = new Node(cur, obj, null);
if(cur == null) {
this.first = newNode;
}else {
this.last = newNode;
newNode.prev = cur;
cur.next = newNode;
}
++size;
}
public boolean remove(int index) {
//按下标删除元素
if(!((index<0)&&(index>size))) {
return false;
}
else {
Node node = node(index);
Node temp = node.prev;
temp.next = node.next;
node.next.prev = temp;
node.next = null;
node.prev = null;
return true;
}
}
private Node node(int index) {
if(!((index<0)&&(index>size))) {
return null;
}
Node temp = this.first;
int i = 0;
while(temp != null) {
temp = temp.next;
++i;
if(i == index) {
break;
}
}
return temp;
}
public boolean contains(Object obj) {
//判断值是否存在
Node temp = this.first;
for(; temp != null; temp = temp.next) {
if(temp == obj) {
return true;
}
}
return false;
}
public int indexOf(Object obj) {
//按照元素获取下标
Node temp = this.first;
while(obj != temp.data) {
temp = temp.next;
}
return size;
}
public boolean set(int index,Object obj) {
//按下标替换元素
if(!((index<0)&&(index>size))) {
return false;
}
Node node = node(index);
node.data = obj;
return true;
}
public Object get(int index) {
//按照下标获取值
int i = 0;
Node temp = this.first;
for(; temp != null; temp = temp.next) {
if(i == index) {
return temp.data;
}
++i;
}
return false;
}
public int length() {
//链表长度
return this.size;
}
public void clear() {
//清除链表
Node temp = this.first;
while(temp != null) {
Node cur = temp.next;
temp.prev = null;
temp.data = null;
temp.next = null;
temp = cur;
size--;
}
this.first = this.last = null;
}
public Object[] toArray() {
Object[] value = new Object[size];
int i = 0;
Node temp = this.first;
for(; temp != null; temp = temp.next) {
value[i++] = temp.data;
}
return value;
}
public void printLink() {
Object[] result = this.toArray();
for (Object object : result) {
System.out.println(object);
}
}
}
public class Test06 {
public static void main(String[] args) {
Link link = Factory.getLinkInstance();
link.add("火车头");
link.add("车厢1");
link.add("车厢2");
link.add("火车尾");
System.out.println(link.contains("车厢3"));
System.out.println(link.indexOf("车厢2"));
System.out.println(link.get(3));
System.out.println(link.length());
System.out.println(link.set(3, "车厢3"));
System.out.println(link.get(3));
link.clear();
System.out.println(link.length());
}
}
Java实现双向链表
最新推荐文章于 2023-04-23 16:09:47 发布