单向循环链表

it2025-04-09  21

如图所示,单向循环链表就是单向链表的最后一个节点从指向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()); } }
最新回复(0)