链表判断有环 单链表反转

判断链表是否有环

定义一个临时变量引用指向当前的节点
定义一个hashmap。key与value当时当前的节点。

该节点存在于hashmap中,node.get(tmp) ,则确定有环, 没有就存放该的节点。

    public static boolean hasLoop2(Node n){
        Node temp1 = n; //临时变量引用指向当前节点
        Map<Node,Node> nodes = new HashMap<>(); //定义hashmap存放node
        
        while(ObjectUtil.isNotNull(n)){
        	//如果hash表中存在要放入的节点,返回true 否则保存到nodes中
            if(ObjectUtil.isNotNull(nodes.get(temp1))) {
            	return true;
            } else {
            	nodes.put(temp1, temp1);
            }
            temp1 = temp1.next;
            if(temp1 == null) {
            	return false;
            }
        }
        return true;
    }

单链表反转

迭代反转链表,从当前链表的首节点开始,一直遍历至链表的最后一个节点,这期间会逐个改变所遍历的节点的指针域,另其指向前一个节点。

具体的实现方法也很简单,借助三个指针即可。首先我们定义3个指针并分别命名为begn,mid,end。他们的初始指向如图3所示:

在这里插入图片描述

递归反转

链表的尾节点开始,依次向前遍历,遍历过程一次改变各节点的指向,即另其指向前一个节点。

class Node {
	private int Data;// 数据域
	private Node Next;// 指针域
	public Node(int Data) {
		// super();
		this.Data = Data;
	}
}
/**
public class javatest1 {
    public static void main(String[] args) {
        Node head = new Node(0);
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        head.setNext(node1);
        node1.setNext(node2);
        node2.setNext(node3);

        // 调用反转方法
        head = Reverse1(head);
         while (null != head) {
            System.out.print(head.getData() + " ");
            head = head.getNext();
        }
    }

    /**
     * 递归,在反转当前节点之前先反转后续节点
     */
    public static Node Reverse1(Node head) {
        // head看作是前一结点,head.getNext()是当前结点,reHead是反转后新链表的头结点
        if (head == null || head.getNext() == null) {
            return head;// 若为空链或者当前结点的下一个节点在尾结点,则直接还回
        }
        Node reHead = Reverse1(head.getNext());// 先反转后续节点head.getNext()
        head.getNext().setNext(head);// 将当前结点的指针域指向前一结点
        head.setNext(null);// 前一结点的指针域令为null;
        return reHead;// 反转后新链表的头结点
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值