循环链表(java实现)

循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。

  循环链表的运算与单链表的运算基本一致。所不同的有以下几点:

  1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。

  2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。

代码:

public class CircularLinkedList< E> {
    private Node< E> head;
    private int length;        //the length of the list
    
    public CircularLinkedList() {
        head = new Node< E>(null, head);
        length = 0;
    }
    
    
    public void insertAtPrior(E item) {//在头节点之后加一个节点
        Node< E> node = new Node< E>(item, null);    //encpsule the item to an node
        node.setNext(head.getNext());    //node.next = head.next
        head.setNext(node);    //head.next = node
        length ++;
    }
    
    public void add(E item) {//在最后节点上添加一个节点
        
        Node< E> tmp = head;
        
        if (isEmpty()) {    // if the list is null
            Node< E> node = new Node< E>(item, head);    // .. if next == null ?
            head.setNext(node);
        } else {
            Node< E> node = new Node< E>(item, head);
            // find the end node of the list 
            while (head != tmp.getNext()) {
                tmp = tmp.getNext();
            }
            tmp.setNext(node);
        }
        
        length++;
    }
    
     public E get(int index) { //获取索引处的节点的数据
       // 先判断索引正确性   
        if (index >length || index < 0) {   
          throw new RuntimeException("索引值有错:" + index);   
        }else if(isEmpty()){
            return null;
        }else{
          Node< E> tmp =head;   
          int i= 1;   
          while (head != tmp.getNext() && i <= index) {
                tmp = tmp.getNext();
                i++;
            }
           E e = tmp.getData();   
          return e;   
       }
    }   
    public void insert(int index, E item) {//在索引处后添加节点
        Node< E> node = new Node< E>(item, null);
        Node< E> tmp = head;
        int i = 1;
        
        if (index > length || index < 0) {
            System.out.println("the index is out of bounds");
        } else if (0 == length && 1 == index) {
            node.setNext(head);
            head.setNext(node);
            length++;
        } else {
            //find the node index
            while (head != tmp.getNext() && i <= index) {
                tmp = tmp.getNext();
                i++;
            }
            node.setNext(tmp.getNext());
            tmp.setNext(node);
            length++;
        }
    }
    
    public void removeFromFront() {//删除头节点之后的第一个节点
        Node< E> tmp = head;
        if (length < 1) {
            System.out.println("The list is null and you can not delete any node!");
        } else if (1 == length) {
            head.setNext(head);
            length--;
        } else {
            head.setNext(tmp.getNext().getNext());
            length--;
        }
    }
    
    public void remove(int index) {//删除索引处的节点
        if (length < 1 || index > length) {
            System.out.println("index is out of bounds");
        } else if (1 == length && 1 == index) {
            head.setNext(head);
            length--;
        } else {
            Node< E> tmp = head;
            int i = 1;
            
            //get the node before index
            while (head != tmp.getNext() && i < index) {
                tmp = tmp.getNext();
                i++;
            }
            tmp.setNext(tmp.getNext().getNext());
            length--;
        }
    }
    
    
    public void removeFromLast() {//删除最后一个节点
        if (length < 1) {     // if the list is null
            System.out.println("The list is null and you can not delete");
        } else if (1 == length) {
            head.setNext(head);
            length--;
        } else {
            Node< E> tmp1 = head;
            Node< E> tmp2 = head.getNext(); //set tmp2 -tmp1 = 1 
            
            while (head != tmp2.getNext()) {
                tmp2 = tmp2.getNext();
                tmp1 = tmp1.getNext();
            }
            tmp1.setNext(head);
            length--;
        }
    }
    
    
    public int getLength() {
        return length;
    }
    
    public boolean isEmpty() {
          return length==0;
    }
    
    
    public void display() {
        if (length < 1) {
            System.out.println("The list is null");
        } else {
            Node< E> tmp = head;
            while (head != tmp.getNext()) {
                tmp = tmp.getNext();
                System.out.print(tmp.getData() + " ");
            }
        }
    }
    //test the list
    public static void main(String[] args) {
        CircularLinkedList< Integer> l = new CircularLinkedList< Integer>();
        System.out.println(l.isEmpty());
        l.add(1);
        l.add(2);
        l.insertAtPrior(3);
        l.insert(2, 4);
        l.add(5);
        System.out.println("the list is : ");
        l.display();
        System.out.println();
        System.out.println("the length is :" + l.getLength());
        l.removeFromFront();
        l.removeFromLast();
        l.display();
        
       // System.out.println(l.get(3));
    }
}
public class Node< E> {
    private Node< E> next;
    private E data;
    
    public Node(E data) {
        this.data = data;
        next = null;
    }
    
    public Node(E data, Node< E> nextNode) {
        this.data = data;
        next = nextNode;
    }
    
   
    public void setData(E data) {
        this.data = data;
    }
    
   
    public void setNext(Node< E> next) {
        this.next = next;
    }
    
   
    public E getData() {
        return data;
    }
    
    
    public Node< E> getNext() {
        return next;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值