如图所示,单向循环链表就是单向链表的最后一个节点从指向null变为指向头节点,从图中可以看出除了在index=0的位置插入节点特殊,因为其他部分都可以看成是单向链表增加节点而已所以对应的add()方法应该如下所示:
public void add(int index
, Object element
) {
rangeCheckForAdd(index
);
size
++;
if(index
==0){
first
=new Node(element
,first
);
Node
<E> last
=node(size
-1);
last
.next
=first
;
}else{
Node
<E> prev
=node(index
-1);
Node
<E> temp
=new Node(element
,prev
.next
);
prev
.next
=temp
;
}
}
先new Node()一个新的节点,让这个新节点的next指向现在的头节点,然后获取到尾节点,让尾节点的next指向新增加的节点即可。 **
对于删除方法的修改:
** 因为在添加节点的时候我们已经形成了一个封闭的环形节点,因此,在这里我们只需要注意如果删除的是头节点这种特殊情况即可,因为别的节点都和单链表的删除方式一模一样。
public E
remove(int index
) {
Node
<E> temp
=null
;
if(index
==0){
temp
=first
;
if (size
==1) {
first
=null
;
}else{
first
=first
.next
;
Node
<E> last
=node(size
-1);
last
.next
=first
;
}
}else{
Node
<E> prev
=node(index
-1);
temp
=prev
.next
;
prev
.next
=prev
.next
.next
;
}
size
--;
return (E
) temp
.element
;
}
总体代码:
public class SingleCircleLinkedList<E>{
private int size
;
private Node
<E> first
;
private static int ELEMENT_NOT_FOUND
=-1;
private static class Node<E>{
Object element
;
Node
<E> next
;
public Node(E element
, Node
<E> next
) {
super();
this.element
= element
;
this.next
= next
;
}
@Override
public String
toString() {
StringBuilder sb
=new StringBuilder();
sb
.append(this.element
+"_"+(this.next
).element
);
return sb
.toString();
}
}
public void clear() {
size
=0;
first
=null
;
}
public int size() {
return size
;
}
public int indexOf(E element
){
if(element
==null
){
for(int i
=0;i
<size
;i
++){
if(node(i
).element
==null
){
return i
;
}
}
}else{
for(int i
=0;i
<size
;i
++){
if(node(i
).element
.equals(element
)){
return i
;
}
}
}
return ELEMENT_NOT_FOUND
;
}
@Override
public String
toString() {
StringBuilder sb
=new StringBuilder();
Node
<E> node
=first
;
sb
.append("[");
for(int i
=0;i
<size
;i
++){
sb
.append(node(i
).toString());
if(i
!=size
-1){
sb
.append(",");
}
}
sb
.append("]");
return sb
.toString();
}
public boolean isEmpty() {
return size
==0;
}
public boolean contains(Object element
) {
for(int i
=0;i
<size
;i
++){
if(element
==null
){
if(node(i
).element
==null
){
return true;
}
}else{
if(node(i
).element
.equals(element
)){
return true;
}
}
}
return false;
}
public void add(Object element
) {
add(size
,element
);
}
public Object
get(int index
) {
return node(index
).element
;
}
public Object
set(int index
, Object element
) {
Node
<E> temp
=node(index
);
E e
=(E
) temp
.element
;
temp
.element
=element
;
return e
;
}
public void add(int index
, Object element
) {
rangeCheckForAdd(index
);
size
++;
if(index
==0){
first
=new Node(element
,first
);
Node
<E> last
=node(size
-1);
last
.next
=first
;
}else{
Node
<E> prev
=node(index
-1);
Node
<E> temp
=new Node(element
,prev
.next
);
prev
.next
=temp
;
}
}
public E
remove(int index
) {
Node
<E> temp
=null
;
if(index
==0){
temp
=first
;
if (size
==1) {
first
=null
;
}else{
first
=first
.next
;
Node
<E> last
=node(size
-1);
last
.next
=first
;
}
}else{
Node
<E> prev
=node(index
-1);
temp
=prev
.next
;
prev
.next
=prev
.next
.next
;
}
size
--;
return (E
) temp
.element
;
}
private Node
node(int index
){
rangeCheck(index
);
Node temp
=first
;
for(int i
=0;i
<index
;i
++){
temp
=temp
.next
;
}
return temp
;
}
private void outBounds(int index
){
throw new IndexOutOfBoundsException("Index:"+index
+",Size: "+size
);
}
private void rangeCheck(int index
){
if(index
<0||index
>=size
){
outBounds(index
);
}
}
private void rangeCheckForAdd(int index
){
if(index
<0||index
>size
){
outBounds(index
);
}
}
public static void main(String
[] args
) {
SingleCircleLinkedList
<Integer> singleCircleLinkedList
=new SingleCircleLinkedList<>();
singleCircleLinkedList
.add(0);
singleCircleLinkedList
.add(1);
singleCircleLinkedList
.add(2);
singleCircleLinkedList
.add(3);
singleCircleLinkedList
.add(4);
singleCircleLinkedList
.remove(4);
System
.out
.println(singleCircleLinkedList
.toString());
}
}