判断单链表是否有环——LinkedList

好久没有看数据结构相关内容,忽然面试官让写判断链表是否有环,竟然写了半天写不出来,汗~

知道自己有多渣,就好好学习吧

接下来开始写判断链表是否有环的方法吧

1.首先定一个结点类Node

package com.example.demo;

public class Node<T> {
    private T val;
    private Node<T> next;

    public Node(T object) {
        this.val=object;
    }

    public void Node(T val) {
        this.val = val;
    }

    public void setVal(T val){
        this.val=val;
    }

    public T getVal(){
        return this.val;
    }


    public Node<T> getNext(){
        return this.next;
    }

    public void setNext(Node<T> node) {
        this.next = node;
    }
    
}

2.然后链表类

package com.example.demo;


import java.util.List;

public class LinkList {
    private Node root;
    private List<Node> list;


    public LinkList() {

    }


    public Node getRoot(){
        return this.root;
    }

    public List<Node> getList() {
        return list;
    }

    public void setList(List<Node> list) {
        this.list = list;
    }

    public void setRoot(Node node) {
        this.root = node;
    }


    public boolean isExistRound(Node root){
        if(root==null){
            return false;
        }
        if(root.getNext()==null){
            return false;
        }
        Node p=root;
        Node q=root.getNext();

        while(q!=null){
            if(p==q){
                return true;
            }
            q=q.getNext();
        }
        return false;
    }


}

3.然后是单元测试

package com.example.demo;

import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class LinkListTest {


    @Test
    public void should_return_true_when_link_is_round() {
        String str = "1-2-3-4-5-6";
        LinkList roundlinkList = createRoundLinkList(str);
        Assert.assertEquals(true, roundlinkList.isExistRound(roundlinkList.getRoot()));
        LinkList notRoundLinkList=createNotRoundLinkList(str);
        Assert.assertEquals(false, notRoundLinkList.isExistRound(notRoundLinkList.getRoot()));


    }

    @Test
    public void should_return_linked_list_value() {
        String str = "1-2-3-4-5";
        LinkList linkList = createNotRoundLinkList(str);
        Node node = linkList.getRoot();
        while (node != null) {
            System.out.println(node.getVal() + " ");
            node = node.getNext();
        }
    }

    public LinkList createRoundLinkList(String str) {
        LinkList linkList = createNotRoundLinkList(str);
        List<Node> nodeList = linkList.getList();
        nodeList.get(nodeList.size()-1).setNext(nodeList.get(0));
        linkList.setList(nodeList);
        return linkList;
    }


    public LinkList createNotRoundLinkList(String str) {
        LinkList linkList = new LinkList();
        List<Node> nodeList = new ArrayList<>();
        Object[] objects = str.split("-");
        for (int i = 0; i < objects.length; i++) {
            nodeList.add(new Node<>(objects[i]));
        }
        linkList.setRoot(nodeList.get(0));
        for (int j = 0; j < nodeList.size() - 1; j++) {
            nodeList.get(j).setNext(nodeList.get(j + 1));
        }
        linkList.setList(nodeList);
        return linkList;
    }
}

 

转载于:https://my.oschina.net/u/2263272/blog/2354329

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值