单向循环链表

单向循环链表

  单向循环链表和单向非环形链表的区就是,单向非环形链表的尾结点的指针是指向null的,而环形的是指向头结点。单向循环链表如图下所示:
在这里插入图片描述

节点类代码
class MyNode {
    int data;
    MyNode next;
    String name;

    public MyNode() {
    }

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

    public MyNode(int data, String name) {
        this.data = data;
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyNode{" +
                "data=" + data +
                ", name='" + name + '\'' +
                '}';
    }
}
单向循环链表代码
public class MyCircleSingleLinkedList {
    // 添加 head 节点,指向头部,添加 tail 节点,指向尾部, 即 head 前一个节点
    MyNode head = null;
    MyNode tail = null;

    // 添加(修改)到单向循环链表
    public void add(MyNode myNode) {
        // 判断该节点是否存在
        MyNode temp = head;
        while (temp != null) {
            // 如果该节点已经存在,则修改
            if (temp.data == myNode.data) {
                temp.name = myNode.name;
                return;
            }
            // 如果遍历结束则退出
            if (temp == tail) {
                break;
            }
            temp = temp.next;
        }
        // 如果单向循环链表为空时
        if (head == null) {
            head = myNode;
            tail = myNode;
            head.next = myNode;
        } else {
            tail.next = myNode;
            myNode.next = head;
            tail = myNode;
        }
    }

    // 删除节点
    public void remove(int id) {
        if (head == null) {
            System.out.println("当前链表为空");
            return;
        }
        // 如果要删除头结点
        if (head.data == id) {
            // 如果只有头结点
            if (head == tail) {
                head = null;
                tail = null;
                return;
            }
            tail.next = head.next;
            head = tail.next;
            return;
        }
        // 删除的不是头结点
        MyNode temp = head;
        while (temp.next != null) {
            // 遍历结束都没有删除的节点
            if (temp.next == head) {
                System.out.println("该节点不存在");
                break;
            }
            // 如果要删除 temp 的下一个节点
            if (temp.next.data == id) {
                // 如果删除尾节点,则tail指向tail前一个节点
                if (temp.next == tail)
                    tail = temp;
                temp.next = temp.next.next;
                break;
            }
            temp = temp.next;
        }
    }

    // 打印链表
    public void print() {
        // 单向循环链表为空时
        if (head == null) {
            System.out.println("当前单向循环链表为空");
            return;
        }
        // 打印
        MyNode temp = head;
        while (temp != null) {
            System.out.println(temp);
            // 如果遍历结束则退出
            if (temp == tail) {
                break;
            }
            temp = temp.next;
        }
    }
   
}

测试一下

public static void main(String[] args) {
    MyCircleSingleLinkedList myCircleSingleLinkedList = new MyCircleSingleLinkedList();
    System.out.println("--------------------添加------------------------");
    myCircleSingleLinkedList.add(new MyNode(1, "Tom"));
    myCircleSingleLinkedList.add(new MyNode(2, "Jone"));
    myCircleSingleLinkedList.add(new MyNode(3, "Line"));
    myCircleSingleLinkedList.print();
    System.out.println("--------------------修改------------------------");
    myCircleSingleLinkedList.add(new MyNode(1, "Yke"));
    myCircleSingleLinkedList.add(new MyNode(2, "Mre"));
    myCircleSingleLinkedList.print();
    System.out.println("--------------------删除------------------------");
    myCircleSingleLinkedList.remove(3);
    myCircleSingleLinkedList.print();
}

运行结果

--------------------添加------------------------
MyNode{data=1, name='Tom'}
MyNode{data=2, name='Jone'}
MyNode{data=3, name='Line'}
--------------------修改------------------------
MyNode{data=1, name='Yke'}
MyNode{data=2, name='Mre'}
MyNode{data=3, name='Line'}
--------------------删除------------------------
MyNode{data=1, name='Yke'}
MyNode{data=2, name='Mre'}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值