问题描述
实现双向循环链表结构的创建
实现链表任意位置元素的插入、删除操作
实现双向循环链表的就地逆置
程序:
import java.util.Scanner;
class Node<AnyType>{
public Node(AnyType d,Node<AnyType> p,Node<AnyType> n){
data=d;
prev=p;
next=n;
}
public AnyType data;
public Node<AnyType> prev;
public Node<AnyType> next;
public AnyType getData(){
return data;
}
public void setData(AnyType Data) {
this.data =Data;
}
}
public class MyLinkedList<AnyType> {
private int theSize;
private Node<AnyType> beginMarker;
private Node<AnyType> endMarker;
public MyLinkedList(){
beginMarker=new Node<AnyType>(null,endMarker,endMarker);
endMarker=new Node<AnyType>(null,beginMarker,beginMarker);
beginMarker.prev=endMarker;
endMarker.next=beginMarker;
theSize=0;
}
public boolean add(AnyType x){
add(size(),x);
return true;
}
public void add(int idx,AnyType x){
Node<AnyType> p;
p=getNode(idx);
addBefore(p,x);
}
private Node<AnyType> getNode(int idx){
Node<AnyType> p;
if(idx<0||idx>size()){
throw new IndexOutOfBoundsException();
}
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;
}
public int size(){
return theSize;
}
private void addBefore(Node<AnyType> p,AnyType x){
Node<AnyType> newNode=new Node<AnyType>(x,p.prev,p);
newNode.prev.next=newNode;
p.prev=newNode;
theSize++;
}
public AnyType remove(int idx){
return remove(getNode(idx));
}
private AnyType remove(Node<AnyType> p){
p.prev.next=p.next;
p.next.prev=p.prev;
theSize--;
return p.data;
}
public AnyType get(int idx){
return getNode(idx).data;
}
public void printList(){
if(beginMarker==null)
System.out.println("Empty List");
else
{
for(Node<AnyType> p=beginMarker.next;p.next!=beginMarker;p=p.next)
System.out.print(p.getData()+" ");
}
System.out.print("\n");
}
public static void main(String args[]){
MyLinkedList<Integer> La = new MyLinkedList<Integer>();
int Lalen;
Scanner sc=new Scanner(System.in);
System.out.println("请输入La表的长度:");
Lalen=sc.nextInt();
System.out.println("请输入"+Lalen+"个数据元素创建La表:");
for(int i=0;i<Lalen;i++){
La.add(sc.nextInt());
}
System.out.println("La链表为:");
La.printList();
System.out.println("插入第i个节点:");
int i=sc.nextInt();
La.add(i,4);
System.out.println("La链表为:");
La.printList();
System.out.println("删除第i个节点:");
int p=sc.nextInt();
La.remove(p);
System.out.println("La链表为:");
La.printList();
System.out.println("插入第一个节点:");
La.add(0,5);
La.printList();
System.out.println("插入最后一个节点:");
La.add(Lalen+1,6);
La.printList();
System.out.println("就地逆置:");
int t=Lalen+2;
int b=0;
for(Lalen=Lalen+1;Lalen>=0;Lalen--){
int a=La.get(t-1);
La.add(b,a);
b=b+1;
La.remove(t);
}
La.printList();
}
}