package p02.动态链表;
import p01.动态数组.List;
public class LinkedListSinglyCircular<E> implements List<E>{
//单向循环链表
private Node head; //头指针
private Node rear; //尾指针
private int size; //元素个数
public LinkedListSinglyCircular(){
head=new Node(); //创建虚拟头结点
head.next=head;
rear=head;
size=0;
}
private class Node{
E data;
Node next;
public Node(){
this(null,null);
}
public Node(E data){
this(data,null);
}
public Node(E data,Node next){
this.data=data;
this.next=next;
}
}
@Override
public int getSize() {
// TODO 自动生成的方法存根
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){//头插
n.next=head.next;
head.next=n;
if(isEmpty()){
rear=n;
rear.next=rear;
}else{
rear.next=head.next;
}
}else if(index==size){//尾插
n.next=rear.next;
rear.next=n;
rear=n;
}else{//中间插
Node p=head;
for(int i=0;i<index;i++){
p=p.next;
}
n.next=p.next;
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) {
if(isEmpty()){
throw new IllegalArgumentException("链表为空");
}
int aimIndex=0;
if(index<0){
aimIndex=size+index%size+1;
}else{
aimIndex=index%size;
}
Node p=head;
for(int i=0;i<aimIndex;i++){
p=p.next;
}
return p.data;
}
@Override
public E getFrist() {
return head.next.data;
}
@Override
public E getLast() {
// TODO 自动生成的方法存根
return rear.data;
}
@Override
public E remove(int index) {
// TODO 自动生成的方法存根
if(index<0||index>=size){
throw new IllegalArgumentException("角标异常");
}
E res=null;
if(index==0){//删头
Node n=head.next;
res=n.data;
head.next=n.next;
n=null;
if(size==1){
rear=head;
head.next=head;
}else{
rear.next=head.next;
}
}else if(index==size-1){//删尾
res=rear.data;
Node p=head;
while(p!=rear){
p=p.next;
}
p.next=rear.next;
rear=p;
}else{//删中间
Node p=head;
for(int i=0;i<index;i++){
p=p.next;
}
Node n=p.next;
res=n.data;
p.next=n.next;
n=null;
}
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) {
// TODO 自动生成的方法存根
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) {
// TODO 自动生成的方法存根
return find(e)!=-1;
}
@Override
public int find(E e) {
// TODO 自动生成的方法存根
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) {
// TODO 自动生成的方法存根
int index=find(e);
if(index!=-1){
remove(index);
}
}
@Override
public void clear() {
// TODO 自动生成的方法存根
head.next=null;
rear=head;
size=0;
}
@Override
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();
}
public LinkedList<Integer> Joseph(){//约瑟夫环
LinkedList<Integer> list=new LinkedList<Integer>();
Node p=head;
while(size>0){
p=p.next.next;
Node n=p.next;
p.next=p.next.next;
list.addLast((Integer) n.data);
size--;
}
return list;
}
}
JAVA数据结构LinkedListSinglyCircular(单向循环链表)以及约瑟夫环的实现
最新推荐文章于 2022-05-14 17:58:49 发布