【算法】链表核心技巧01--快慢指针

本文详细介绍了链表操作中的核心技巧——快慢指针的应用。通过快慢指针,我们可以轻松找到链表的中间节点、判断链表是否有环,以及删除倒数第n个节点。具体实现包括:使用双速移动的指针找到链表中间值,通过快慢指针对环状链表的检测,以及调整快慢指针间距来定位并删除链表倒数第n个节点的方法。
摘要由CSDN通过智能技术生成

链表的快慢指针

快慢指针就是定义两根指针,控制移动的速度一快一慢,以此来制造出自己想要的差值。这个差值通常可以让我们找到链表上相应的中间节点。

寻找链表的中间值

寻找链表的中间值常用在链表的归并排序中,分治思想中需要对链表进行分段cut,即找到链表的中间节点,然后进行截断。利用快慢指针问题就变成,快指针移动的速度是慢指针的两倍,所以当快指针只想链表尾节点时,慢指针正好指向链表的中间节点。

public ListNode(ListNode head) {
	ListNode fast = head;
    ListNode slow = head;
    while(fast != null) {
    	slow = slow.next;
        fast = fast.next;
        if (fast != null) {
        	fast = fast.next;
        }
   	}
   	return slow;
}
判断链表中是否有环

快慢指针中,因为每一次移动后,快指针都会比慢指针多走一个节点,所以他们之间在进入环状链表后,不论相隔多少个节点,慢指针总会被快指针赶上并且重合,此时就可以判断必定有环。

public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }
        
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow.equals(fast)) {
                return true;
            }
        }
        return false;
    }
删除倒数第n个节点

这个问题主要是找出倒数第n个节点,这又回到了长短指针擅长的差值上来,即只需要让快指针的移动速度比慢指针快n个节点,则快指针移动到尾节点时,慢指针便在倒数第n个节点,此时对原链表的next节点设置称next.next节点,相当于删除了这个节点。

 public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        dummy.next = head;
		
		/** 快指针比慢指针快n个节点*/
        ListNode fast = dummy;
        for (int i=0; i<n; i++) {
            fast = fast.next;
        }
        ListNode slow = dummy;

        while(fast != null && fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return dummy.next;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值