链表 -- 循环链表(线性表)

1,循环列表只是单向链表的最后节点地址指向第一个节点。

 

2,Node 类

public class Node {

    String name;
    
    Node next;
    
    public Node(){
        
    }
    
    public Node(String name){
        this.name = name;
        this.next = null;
    }
}

3,链表类

public class CLink {

    int size;

    Node first;

    public CLink() {
        this.size = 0;
    }

    public boolean isEmpty() {
        return first == null;
    }

    public void addNode(String name) {
        if (first == null) {
            first = new Node(name);
            first.next = first;
            size++;
        } else {
            Node newNode = new Node(name);
            Node temp = first;
            while (temp.next != first) {
                temp = temp.next;
            }
            newNode.next = first;
            temp.next = newNode;
            size++;
        }
    }

    public void removeNode(String name) {
        if (first == null) {
            return;
        }
        // 删除链表头
        if (first.name.equals(name)) {
            Node temp = first;
            while (temp.next != first) {
                temp = temp.next;
            }
            first = first.next;
            temp.next = first;
            size--;
            return;
        }
        // 删除链表尾
        Node temp = first;
        Node p = null;
        while (temp.next != first) {
            p = temp;
            temp = temp.next;
        }
        if (temp.name.equals(name)) {
            p.next = first;
            size--;
            return;
        }
        // 删除链表中间
        Node tem = first;
        while (!tem.next.name.equals(name)) {
            tem = tem.next;
        }
        tem.next.next = tem.next;
        size--;
    }

    public void insertNode(String data, String name) {
        // 插入到指定位置之后
        Node temp = first;
        while (!temp.name.equals(data)) {
            temp = temp.next;
        }
        Node newNode = new Node(name);
        newNode.next = temp.next;
        temp.next = newNode;
        size++;
    }

    public void display() {
        Node temp = first;
        if(temp.next == first){
            System.out.println(temp.name+"   ==>:   "+temp.next.name);
            return;
        }
        
        while (temp.next != first) {
            System.out.println(temp.name+"   ==>:   "+temp.next.name);
            temp = temp.next;
        }
        System.out.println(temp.name+"   ==>:   "+temp.next.name);
    }

    public void insertFirst(String name) {
        // 插入到链表的第一个位置
        Node newNode = new Node(name);
        newNode.next = first;
        first = newNode;
        if(first.next == null){
            first.next = first;
            size++;
            return;
        }
        Node second = first.next;
        while (second.next != first.next) {
            second = second.next;
        }
        second.next = first;
        size++;
    }
}

4,测试类

public class Ctest {

    public static void main(String[] args) {
        CLink clink = new CLink();
        clink.insertFirst("外县典吏");
        clink.addNode("翰林院待诏");
        clink.addNode("各部院九品笔贴式");
        clink.addNode("翰林院典簿");
        clink.addNode("太医院御医");
        clink.addNode("翰林院检讨");
        clink.addNode("翰林院修编");
        clink.addNode("翰林院修撰");
        clink.addNode("国子监司业");
        clink.addNode("鸿胪寺少卿");
        clink.addNode("光禄寺少卿");
        clink.addNode("翰林院侍读学士");
        clink.addNode("大理寺少卿");
        clink.addNode("光禄寺卿");
        clink.addNode("都察院左副都御史");
        clink.addNode("各省巡抚");
        clink.addNode("各省巡抚");
        clink.addNode("太子少傅");
        clink.addNode("少师");
        clink.addNode("太师");
        clink.display();
        
        System.out.println("================我是分界线================");
        
        clink.removeNode("太师");
        clink.display();
        
        
        System.out.println("================我是分界线================");
        
        clink.removeNode("外县典吏");
        clink.display();
        
        
        clink.insertNode("少师", "太师");
        clink.display();
        
        
        System.out.println(clink.size);
        
    }
}


5,打印结果

外县典吏   ==>:   翰林院待诏
翰林院待诏   ==>:   各部院九品笔贴式
各部院九品笔贴式   ==>:   翰林院典簿
翰林院典簿   ==>:   太医院御医
太医院御医   ==>:   翰林院检讨
翰林院检讨   ==>:   翰林院修编
翰林院修编   ==>:   翰林院修撰
翰林院修撰   ==>:   国子监司业
国子监司业   ==>:   鸿胪寺少卿
鸿胪寺少卿   ==>:   光禄寺少卿
光禄寺少卿   ==>:   翰林院侍读学士
翰林院侍读学士   ==>:   大理寺少卿
大理寺少卿   ==>:   光禄寺卿
光禄寺卿   ==>:   都察院左副都御史
都察院左副都御史   ==>:   各省巡抚
各省巡抚   ==>:   各省巡抚
各省巡抚   ==>:   太子少傅
太子少傅   ==>:   少师
少师   ==>:   太师
太师   ==>:   外县典吏
================我是分界线================
外县典吏   ==>:   翰林院待诏
翰林院待诏   ==>:   各部院九品笔贴式
各部院九品笔贴式   ==>:   翰林院典簿
翰林院典簿   ==>:   太医院御医
太医院御医   ==>:   翰林院检讨
翰林院检讨   ==>:   翰林院修编
翰林院修编   ==>:   翰林院修撰
翰林院修撰   ==>:   国子监司业
国子监司业   ==>:   鸿胪寺少卿
鸿胪寺少卿   ==>:   光禄寺少卿
光禄寺少卿   ==>:   翰林院侍读学士
翰林院侍读学士   ==>:   大理寺少卿
大理寺少卿   ==>:   光禄寺卿
光禄寺卿   ==>:   都察院左副都御史
都察院左副都御史   ==>:   各省巡抚
各省巡抚   ==>:   各省巡抚
各省巡抚   ==>:   太子少傅
太子少傅   ==>:   少师
少师   ==>:   外县典吏
================我是分界线================
翰林院待诏   ==>:   各部院九品笔贴式
各部院九品笔贴式   ==>:   翰林院典簿
翰林院典簿   ==>:   太医院御医
太医院御医   ==>:   翰林院检讨
翰林院检讨   ==>:   翰林院修编
翰林院修编   ==>:   翰林院修撰
翰林院修撰   ==>:   国子监司业
国子监司业   ==>:   鸿胪寺少卿
鸿胪寺少卿   ==>:   光禄寺少卿
光禄寺少卿   ==>:   翰林院侍读学士
翰林院侍读学士   ==>:   大理寺少卿
大理寺少卿   ==>:   光禄寺卿
光禄寺卿   ==>:   都察院左副都御史
都察院左副都御史   ==>:   各省巡抚
各省巡抚   ==>:   各省巡抚
各省巡抚   ==>:   太子少傅
太子少傅   ==>:   少师
少师   ==>:   翰林院待诏
翰林院待诏   ==>:   各部院九品笔贴式
各部院九品笔贴式   ==>:   翰林院典簿
翰林院典簿   ==>:   太医院御医
太医院御医   ==>:   翰林院检讨
翰林院检讨   ==>:   翰林院修编
翰林院修编   ==>:   翰林院修撰
翰林院修撰   ==>:   国子监司业
国子监司业   ==>:   鸿胪寺少卿
鸿胪寺少卿   ==>:   光禄寺少卿
光禄寺少卿   ==>:   翰林院侍读学士
翰林院侍读学士   ==>:   大理寺少卿
大理寺少卿   ==>:   光禄寺卿
光禄寺卿   ==>:   都察院左副都御史
都察院左副都御史   ==>:   各省巡抚
各省巡抚   ==>:   各省巡抚
各省巡抚   ==>:   太子少傅
太子少傅   ==>:   少师
少师   ==>:   太师
太师   ==>:   翰林院待诏
19

 

posted @ 2018-09-05 10:49  Chris,Cai  阅读(821)  评论(0编辑  收藏  举报