单向循环链表的基本操作: java语言实现

1. 单向循环链表简单介绍

      单向循环链表(Singly Circular Linked List)是另一种形式的链式存贮结构。与单向链表不同,单向循环链表中没有next指针为null的结点,它的特点是表中最后一个结点的指针域指向表头结点,整个链表形成一个环。

2 单向循环链表的基本操作

2.1 创建结点类

public class SCLLNode {
    private int data;//数据域
    private SCLLNode next;//指针域

    public SCLLNode(int data) {
        this.data = data;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public SCLLNode getNext() {
        return next;
    }

    public void setNext(SCLLNode next) {
        this.next = next;
    }

    public void display() {
        System.out.print( data + " ");
    }
}
2.2 创建链表类

public class SinglyCircularLinkedList {
    private SCLLNode head;//表头
    private int length = 0;

    public SinglyCircularLinkedList() {
        this.head = null;
    }

    //在链表头部添加结点
    public void addHead(int data) {
        SCLLNode newNode = new SCLLNode(data);
        newNode.setNext(newNode);
        if(head == null){
            head = newNode;
        } else{
            SCLLNode curNode = head;
            while(curNode.getNext() != head) {
                curNode = curNode.getNext();
            }
            newNode.setNext(head);
            curNode.setNext(newNode);
            head = newNode;
        }
        length++;
    }

    //在链表头部删除结点
    public void deleteHead() {
        if(head == null){
            System.out.println("空表,删除的结点不存在");
        }
        SCLLNode curNode = head;
        SCLLNode temp =head;
        while(curNode.getNext() != head) {
            curNode = curNode.getNext();
        }
        curNode.setNext(head.getNext());
        head =head.getNext();
        temp = null;
        length--;
    }

    //在链表尾部添加结点
    public void addTail(int data) {
        SCLLNode newNode = new SCLLNode(data);
        newNode.setNext(newNode);
        if (head == null) {
            head = newNode;
        } else {
            SCLLNode curNode = head;
            while(curNode.getNext() != head) {
                curNode = curNode.getNext();
            }
            newNode.setNext(head);
            curNode.setNext(newNode);
        }
        length++;
    }

    //在链表尾部删除结点
    public void deleteTail() {
        if(head == null){
            System.out.println("空表,删除的结点不存在");
        }
        SCLLNode curNode = head;
        SCLLNode preNode =head;
        while(curNode.getNext() != head) {
            preNode = curNode;
            curNode = curNode.getNext();
        }
        preNode.setNext(head);
        curNode = null;
        length--;
    }

    //在指定位置插入结点
    public void insertList(int data, int index) {
        SCLLNode newNode = new SCLLNode(data);
        newNode.setNext(newNode);
        if(head == null){
            head = newNode;
        }
        if(index > length+1 || index < 1) {
            System.out.println("结点插入的位置不存在,可插入的位置为1到"+(length+1));
        }
        if(index == 1) {
            SCLLNode curNode = head;
            while(curNode.getNext() != head) {
                curNode = curNode.getNext();
            }
            newNode.setNext(head);
            curNode.setNext(newNode);
            head = newNode;
        } else{
            SCLLNode preNode = head;
            int count = 1;
            while(count < index-1) {
                preNode = preNode.getNext();
                count++;
            }
            SCLLNode curNode = preNode.getNext();
            newNode.setNext(curNode);
            preNode.setNext(newNode);
        }
        length++;
    }

    //在指定位置删除结点
    public void deleteList(int index) {
        if(index > length || index < 1) {
            System.out.println("结点删除的位置不存在,可删除的位置为1到"+length);
        }
        if(index == 1) {
            SCLLNode curNode = head;
            SCLLNode temp =head;
            while(curNode.getNext() != head) {
                curNode = curNode.getNext();
            }
            curNode.setNext(head.getNext());
            head =head.getNext();
            temp = null;
            length--;
        } else{
            SCLLNode preNode = head;
            int count = 1;
            while(count < index-1) {
                preNode = preNode.getNext();
                count++;
            }
            SCLLNode curNode = preNode.getNext();
            preNode.setNext(curNode.getNext());
            length--;
        }
    }

    //查找数据是否存在
    public boolean containData(int data) {
        if(head == null){
            System.out.println("空表");
            return false;
        }
        SCLLNode curNode = head;
        while(curNode.getData()!= data){
            if(curNode.getNext() == head) {
                System.out.println("结点数据不存在");
                return false;
            }
            curNode =curNode.getNext();
        }
        System.out.println("结点数据存在");
        return true;
    }

    //获取指定位置的数据
    public void getIndexData(int index) {
        if(head == null){
            System.out.println("空表");
        }
        if(index > length || index < 1) {
            System.out.println("结点位置不存在,可获取的位置为1到"+length);
        }else {
            SCLLNode curNode = head;
            int count =1;
            while(count != index) {
                curNode =curNode.getNext();
                count++;
            }
            curNode.display();
            System.out.println();
        }
    }

    //修改指定位置的结点数据
    public void updateIndexData(int index, int data) {
        if(head == null){
            System.out.println("空表");
        }
        if(index > length || index < 1) {
            System.out.println("结点位置不存在,可更新的位置为1到"+length);
        }else {
            SCLLNode curNode = head;
            int count =1;//while也可以用for循环方式解决
            while(count != index) {
                curNode =curNode.getNext();
                count++;
            }
            curNode.setData(data);
        }
    }

    //遍历链表
    public void printAllNode() {
        SCLLNode cur = head;
        while (cur != null) {
            cur.display();
            cur = cur.getNext();
            if(cur == head) {
                break;
            }
        }
        System.out.println();
    }

    //获取链表的长度
    public int  listLength() {
        return length;
    }
}

3 建立测试类

测试类建立如下,运行结果这里不再赘述。

public class SinglyCircularLinkedListTest {
    public static void main(String[] args) {
        SinglyCircularLinkedList list = new SinglyCircularLinkedList();
        list.addHead(3);
        list.addHead(2);
        list.addHead(1);
        list.addTail(4);
        list.addTail(5);
        list.addTail(6);
        //list.deleteHead();
        //list.deleteTail();
        //list.insertList(0,0);
        //list.deleteList(3);
        //list.containData(0);
        list.getIndexData(7);
        //list.updateIndexData(7,0);
        list.printAllNode();
    }
}

4 参考资料

[1] 数据结构与算法经典问题解析

[2] 单向链表的基本操作: java语言实现







猜你喜欢

转载自blog.csdn.net/cqulun123/article/details/80294644
今日推荐