package design;
import java.util.Scanner;
//循环双链表
public class LinkedList<AnyType> {
private int theSize;
private Node<AnyType> beginMarker;
private Node<AnyType> endMarker;
class Node<AnyType>{ //定义匿名类Node
public AnyType data;
public Node<AnyType> prev;
public Node<AnyType> next;
public Node(AnyType d,Node<AnyType> p,Node<AnyType> n){
this.data=d;
this.prev=p;
this.next=n;
}
}
public LinkedList(){ //构造方法
beginMarker=new Node<AnyType>(null,endMarker,endMarker);
endMarker=new Node<AnyType>(null,beginMarker,beginMarker);
beginMarker.next=endMarker;
theSize=0;
}
public int size(){
return theSize;
}
public Node<AnyType> getNode(int idx){ //返回idx对应的结点
Node<AnyType> p=null;
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;
}
public boolean add(AnyType x){ //插入元素
add(size(),x);
return true;
}
private void add(int idx,AnyType x){
if(idx>size()||idx<0){
System.out.println("输入错误");
}else{
Node<AnyType> p;
p=getNode(idx);
Node<AnyType> newNode=new Node<AnyType>(x,p.prev,p);
newNode.prev.next=newNode;
p.prev=newNode;
theSize++;
}
}
public AnyType remove(int idx){ //删除元素
if(idx>size()||idx<0){
System.out.println("无法找到该节点");
return null;
}else
return remove(getNode(idx));
}
public AnyType remove(Node<AnyType> p){
p.next.prev=p.prev;
p.prev.next=p.next;
theSize--;
return p.data;
}
public void addFirst(AnyType data){
add(0,data);
}
public void addLast(AnyType data){
add(size(),data);
}
public void trs(){
Node p=beginMarker;
while(p.next!=beginMarker){
Node q=p;
Node r=p.next;
q.next=q.prev;
q.prev=r;
p=p.prev;
}
Node q=p;
Node r=p.next;
q.next=q.prev;
q.prev=r;
Node s=beginMarker;
beginMarker=endMarker;
endMarker=s;
int i=0;
for(Node x=beginMarker.next;x!=endMarker;x=x.next){
System.out.println(i+": "+x.data);
i++;
}
i=0;
}
public void print(){
int i=0;
for(Node x=beginMarker.next;x.next!=beginMarker;x=x.next){
System.out.println(i+": "+x.data);
i++;
}
i=0;
}
public static void main(String[] args) {
//验证部分
LinkedList<String> La=new LinkedList<String>();
System.out.println("1:创建链表");
System.out.println("2:添加结点");
System.out.println("3:删除结点");
System.out.println("4:添加第一个");
System.out.println("5:添加最后一个");
System.out.println("6 :转置");
System.out.println("请输入要进行的操作");
Scanner sc=new Scanner(System.in);
boolean flag=true;
while(flag){
System.out.println("请输入您的要进行的操作:");
int c=sc.nextInt();
switch(c){
case 1: System.out.println("请输入数据个数");
int n=sc.nextInt();
System.out.println("输入数据");
for(int i=0;i<n;i++){
String data=sc.next();
La.add(data);
}
La.print();
break;
case 2: System.out.println("输入数据的插入位置和数据");
int w=sc.nextInt();
String data=sc.next();
La.add(w,data);
La.print();
break;
case 3: System.out.println("输入要删除结点的位置");
int q=sc.nextInt();
La.remove(q);
La.print();break;
case 4: System.out.println("输入要添加的数据");
String d=sc.next();
La.addFirst(d);
La.print();break;
case 5: System.out.println("输入要添加的数据");
String da=sc.next();
La.addLast(da);
La.print();break;
case 6: La.trs();
break;
default :System.out.println("您输错了,请重新输入");break;
}
}
}
}
双向循环链表(插入,删除,就地逆置)
最新推荐文章于 2023-09-07 16:46:21 发布