package p02.动态链表;
import java.util.Arrays;
import p01.动态数组.List;
public class LinkedListDoubleCircular<E> implements List<E>{
private Node head; //头指针
private Node rear; //尾指针
private int size; //元素个数
public LinkedListDoubleCircular(){
head=new Node(); //创建虚拟头结点
head.next=head;
head.pre=head;
rear=head;
size=0;
}
public class Node{
E data;
Node pre;
Node next;
public Node(){
this(null,null,null);
}
public Node(E data){
this(data,null,null);
}
public Node(E data,Node pre,Node next){
this.data=data;
this.pre=pre;
this.next=next;
}
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
// TODO 自动生成的方法存根
return size==0;
}
@Override
public void add(int index, E e) {
// TODO 自动生成的方法存根
if(index<0||index>size){
throw new IllegalArgumentException("角标非法");
}
Node n=new Node(e);
if(index==0){
if(isEmpty()){
//尾插
n.next=rear.next;
rear.next=n;
n.pre=rear;
rear=n;
head.pre=rear;
}else{
//头插
head.next.pre=n;
n.next=head.next;
n.pre=head;
head.next=n;
}
}else if(index==size){
//尾插
n.next=rear.next;
rear.next=n;
n.pre=rear;
rear=n;
head.pre=rear;
}else{
Node p=head;
for(int i=0;i<index;i++){
p=p.next;
}
p.next.pre=n;
n.next=p.next;
n.pre=p;
p.next=n;
}
size++;
}
@Override
public void addFrist(E e) {
// TODO 自动生成的方法存根
add(0, e);
}
@Override
public void addLast(E e) {
// TODO 自动生成的方法存根
add(size, e);
}
@Override
public E get(int index) {
Node p=head;
for(int i=0;i<=index;i++){
p=p.next;
}
return p.data;
}
@Override
public E getFrist() {
return get(0);
}
@Override
public E getLast() {
// TODO 自动生成的方法存根
return get(size-1);
}
@Override
public E remove(int index) {
if(index<0||index>=size){
throw new IllegalArgumentException("角标异常");
}
if(size==0){
return null;
}
E res=null;
if(index==0){//删头
Node n=head.next;
if(size==1){//最后一个
res=n.data;
n=null;
head.next=head;
head.pre=head;
rear=head;
}else{
n.next.pre=head;
head.next=n.next;
res=n.data;
}
}else if(index==size-1){//删尾
Node n=rear;
rear.pre.next=rear.next;
rear.next.pre=rear.pre;
rear=rear.pre;
res=rear.data;
}else{//删中间
Node p=head;
for(int i=0;i<index;i++){
p=p.next;
}
Node n=p.next;
n.next.pre=p;
p.next=n.next;
res=n.data;
}
size--;
return res;
}
@Override
public E removeFrist() {
// TODO 自动生成的方法存根
return remove(0);
}
@Override
public E removeLast() {
// TODO 自动生成的方法存根
return remove(size-1);
}
@Override
public void set(int index, E e) {
if(index<0||index>=size){
throw new IllegalArgumentException("角标越界");
}
Node p=head;
for(int i=0;i<=index;i++){
p=p.next;
}
p.data=e;
}
@Override
public boolean contains(E e) {
// return find(e)!=-1;
return find(e)==-1?false:true;
}
@Override
public int find(E e) {
if(isEmpty()){
return -1;
}
int index=-1;
Node p=head;
while(p.next!=null){
index++;
p=p.next;
if(p.data.equals(e)){
return index;
}
}
return -1;
}
@Override
public void removeElement(E e) {
int index=find(e);
if(index!=-1){
System.out.println(index);
remove(index);
}
}
@Override
public void clear() {
head.next=head;
head.pre=head;
rear=head;
size=0;
}
public String toString(){
StringBuilder sb=new StringBuilder();
if(isEmpty()){
return "[]";
}else{
sb.append("[");
Node p=head;
while(true){
p=p.next;
if(p==rear){
sb.append(p.data+"]");
break;
}else{
sb.append(p.data+",");
}
}
}
return sb.toString();
}
}
JAVA数据结构LinkedListDoubleCircular(双向循环链表)
猜你喜欢
转载自blog.csdn.net/sl1130398099/article/details/88918815
今日推荐
周排行