您的位置:首页 > 其它

第一章链表

2016-01-29 19:56 441 查看
今天写双向循环链表的java代码实现
class Node<AnyType>{
public AnyType data;
public Node<AnyType>prev;
public Node<AnyType>next;
public Node(){
data=null;
prev=null;
next=null;
}
public Node(AnyType d,Node<AnyType> p,Node<AnyType>n){
data=d;
prev=p;
next=n;
}
}
public class MyDoubleCircularLinkedList<AnyType> {
private int theSize=0;
private int modCount=0;
private Node beginMarker;
private Node endMarker;
public void nizhi()//就地逆置的代码实现
{

Node c,d;
d=beginMarker;
c=beginMarker;
for(int i=0;i<theSize+2;i++){
Node a=c.prev;
Node b=c.next;
c.prev=b;
c.next=a;
c=c.next;

}
beginMarker=endMarker;
endMarker=d;

}
public MyDoubleCircularLinkedList(){
beginMarker =new Node();
endMarker=new Node();
beginMarker.prev=endMarker;
endMarker.next=beginMarker;
endMarker.prev=beginMarker;
beginMarker.next=endMarker;
theSize=0;

}
public int Size(){
return theSize;
}
public boolean isEmpty(){
return Size()==0;
}
public boolean add(AnyType x){
add(Size(),x);
return true;
}
public void add(int idx,AnyType x){
addBefore(getNode(idx),x);
}
private Node getNode(int idx){
Node p;
if(idx<0||idx>Size())
System.out.println("超出范围");
if(idx<Size()/2){//从前向后找
p=beginMarker.next;
for(int i=0;i<idx;i++)
p=p.next;

}
else{
p=endMarker;
for(int i=Size();i>idx;i--)
p=p.prev;
}
return p;
}

private void addBefore(Node p,AnyType x){
Node newNode=new Node(x,p.prev,p);
newNode.prev.next=newNode;
p.prev=newNode;
theSize++;
modCount++;
}
public AnyType set(int idx,AnyType x){
Node p=getNode(idx);
AnyType oldVal=(AnyType) p.data;
p.data=x;
return oldVal;

}
public AnyType remove(int idx){
return remove(getNode(idx));
}
private AnyType remove(Node p){
p.next.prev=p.prev;
p.prev.next=p.next;
theSize--;
modCount++;
return (AnyType) p.data;
}
public void Inverse(MyDoubleCircularLinkedList list){
int size=Size();
for(int i=size-1;i>=0;i--)
{
list.add(this.getNode(i).data);
}
}
public void print(){
Node firstNode=beginMarker.next;
if(firstNode.data==null){
System.out.println("链表为空");
}
else{
while(firstNode.data!=null){
System.out.println(firstNode.data);
firstNode=firstNode.next;
}
}
}

public static void main(String[]args){
System.out.println("下面是展示的时间了,欢迎观看双向循环链表的展示");
MyDoubleCircularLinkedList<Integer> list=new MyDoubleCircularLinkedList<Integer>();
System.out.println("请输入要添加的节点数目");
Scanner in=new Scanner(System.in);
int m=in.nextInt();
System.out.println("请输入节点");
int a;
for(int i=0;i<m;i++){
a=in.nextInt();
list.add(a);
}
list.print();
System.out.println("请输入要删除的节点的位置");
int b;
b=in.nextInt();
list.remove(b);
list.print();
System.out.println("请输入要插入节点的位置和节点");
int q,p;
q=in.nextInt();
p=in.nextInt();
list.add(q, p);
list.print();
System.out.println("请插入第一个节点");
p=in.nextInt();
list.add(0, p);
list.print();
System.out.println("插入最后一个节点");
p=in.nextInt();
list.add(list.Size(), p);

list.print();
System.out.println("下面是就地转置了");

list.nizhi();

list.print();
System.out.println("谢谢观赏,bye");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: