环形链表的构建

环形链表:所谓环形链表通俗的来说就是一个结点可以通过若干次遍历之后,又可以 遍历到自身。

环形链表的创建思路:

考虑到所有的结点加入进链表都要成环,则将第一个结点特殊化,每次将新的结点加进来都指向第一个结点,每次都断开上一个结点指向第一个结点的指针。这样保证链表成为一个尾指向头的环形链表。

我们将用到三个指针:

第一个firstNode指针,永远都指向第一个结点。

第二个指针curNode,指向链表的最后一个结点。

第三个就是指向当前加进来结点的指针heroNode

在对第一个结点进行操作时(第一个结点有且仅需要操作一次)

 firstNode = heroNode;
 firstNode.next = firstNode;
 curNode = firstNode;
 flag = 0;

先将firstNode指针指向当前的Heronode

再使firstNode的next也指向firstNode,成环。

最后将curNode指向当前的结点,也就是firstNode

若有新的结点进来时(之后的操作都是对新结点进行操作):

 

curNode.next=heroNode;
heroNode.next=firstNode;
curNode=heroNode;

 curNode是指向第一个结点的,我们将curNode指向新进来的结点,则结点一的环就断开了。

 再将heroNode也就是指向当前节点的指针指向firstNode,则尾和firstNode就成了环。

最后将curNode指向此时链表的最后一个结点,也就是heroNode。

每次有新的结点进来时都进行以上操作,注意:第一个节点有且仅需要操作一次

package datastructure01.circularlinkedlist;

public class CirclularLinkedListDemo {
    public static void main(String[] args) {
        HeroNode heroNode1 = new HeroNode(1, "zz");
        HeroNode heroNode2 = new HeroNode(2, "xx");
        HeroNode heroNode3 = new HeroNode(3, "aa");
        HeroNode heroNode4 = new HeroNode(4, "ss");
        CirclularLinkedList cl = new CirclularLinkedList();
        cl.add(heroNode1);
        cl.add(heroNode2);
        cl.add(heroNode3);
        cl.add(heroNode4);
        cl.select();
        System.out.println("-------------");
    }


}

class CirclularLinkedList {
    HeroNode firstNode = null;
    HeroNode curNode = null;
    int flag = 1;

    public void add(HeroNode heroNode) {
        if (flag == 1) {                
            firstNode = heroNode;
            firstNode.next = firstNode;
            curNode = firstNode;
            flag = 0;
        } else {
            curNode.next=heroNode;
            heroNode.next=firstNode;
            curNode=heroNode;
        }


    }

    public void select() {
        HeroNode temp=firstNode;
        while (true){
            System.out.println(temp);
            if(temp.next==firstNode){
                break;
            }
            else {
                temp=temp.next;
            }
        }

    }
}

class HeroNode {
    private int num;
    private String name;

    HeroNode next;

    public HeroNode(int num, String name) {
        this.num = num;
        this.name = name;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "num=" + num +
                ", name='" + name + '\'' +
                '}';
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天你学习了ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值