循环链表及其各种操作

什么是循环链表:
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个链表形成一个环,这种头尾相接的单链表成为单循环链表,简称循环链表(circular linked list)。

这里写图片描述

循环链表的各种操作与单链表的相似,只是要注意循环链表的尾结点是指向头结点的

class TestCLink{
    Entry head;
    public TestCLink(){//头结点的初始化
        this.head=new Entry();
        this.head.next=this.head;
    }



    class Entry{//
        int data;
        Entry next;
        public Entry(){
            this.data = -1;
            next = null;
        }


        public Entry(int data){
            this.data = data;
            next = null;
        }

    }
    //头插法,与单链表的头插法相似,
    public void inserthead(int val){
        Entry entry=new Entry(val);
        entry.next=this.head.next;
        this.head.next=entry;
    }

    //尾插法
    public void insertrail(int val){
        Entry cur=this.head;
        Entry entry=new Entry(val);
        while(cur.next!=this.head){//先找到尾结点,与单链表大致相同,但是注意循环链表的尾结点是指向头结点的
            cur=cur.next;

        }
        entry.next=cur.next;
        cur.next=entry;

    }
    //删除一个val
    public void delete(int val){
        Entry fast=this.head.next;
        Entry slow=this.head;

        while(fast.data!=val&&fast.next!=this.head){
            fast=fast.next;
            slow=slow.next;

        }
        slow.next=fast.next;


    }
    //删除全部的val
    public void deleteAll(int val)
    {
        Entry t1 = this.head;
        Entry t2 = this.head.next;
        while(t2 != this.head)
        {
            if(t2.data == val)
            {
                t1.next = t2.next;
                t2 = t1.next;
            }
            else
            {
                t1 = t1.next;
                t2 = t2.next;
            }
        }
    }
    //得到链表的长度
    public void getlength(){
        Entry cur=this.head;//获取头结点
        int i=0;
        while(cur.next!=this.head){
            i++;
            cur=cur.next;
        }
        System.out.println("单链表长度为"+i);
    }
    //判断链表是否为空
    public boolean isempty(){
        Entry cur=this.head;
        if(cur.next==this.head){
            return true;
        }
        return false;

    }
    //打印循环链表
    public void show(){
        Entry cur=this.head.next;
        while(cur!=this.head){
            System.out.println("cur.data= "+cur.data+" ");
            cur=cur.next;
        }
    }

    }
public class test1 {

    public static void main(String[] args) {
        TestCLink t1=new TestCLink();
        for(int i=0;i<5;i++){

            t1.insertrail(i);
        }
        t1.insertrail(5);
        t1.insertrail(5);

        t1.show();
        System.out.println("====删除第一个5=====");
        t1.delete(5);
        t1.show();
        t1.getlength();
        System.out.println("====删除全部5=====");
        t1.deleteAll(5);
        t1.show();
        // TODO Auto-generated method stub

    }

}

运行结果:
cur.data= 0
cur.data= 1
cur.data= 2
cur.data= 3
cur.data= 4
cur.data= 5
cur.data= 5
====删除第一个5=====
cur.data= 0
cur.data= 1
cur.data= 2
cur.data= 3
cur.data= 4
cur.data= 5
单链表长度为6
====删除全部5=====
cur.data= 0
cur.data= 1
cur.data= 2
cur.data= 3
cur.data= 4

猜你喜欢

转载自blog.csdn.net/qq_37232304/article/details/80209636
今日推荐