算法通关村第1关【白银】| 双指针专题

一、寻找中间结点

算法通关村第1关【白银】| 双指针专题_第1张图片

思路:快慢指针,slow走一步,fast走两步,当fast为null或者fast.next为空,slow必定在中间

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}

二、链表中倒数第k个结点

算法通关村第1关【白银】| 双指针专题_第2张图片

思路:fast比slow指针快k-1个结点,当fast遍历到尾结点则slow指向倒数第k个结点 

class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode slow = head;
        ListNode fast = head;
        while(k > 1){
            fast = fast.next;
            k--;
        }
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next;
        }
        return slow;
    }
}

三、旋转链表

算法通关村第1关【白银】| 双指针专题_第3张图片

思路:快慢指针,找到倒数第k个结点就是要断开的点,然后将前后两个链表拼接。有可能k大于链表长度需要注意,特殊情况k=0,head=null也要注意

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null){
            return null;
        }
        if(k == 0){
            return head;
        }
        ListNode start = head;
        ListNode end = head;
        while(k>0){
            if(end.next == null){
                end = head;
            }else{
            end = end.next;
            }
            k--;
        }
        while(end != null && end.next != null){
            start = start.next;
            end = end.next;
        }
        if(start.next == null){
            return head;
        }
        ListNode p = start.next;
        start.next = null;
        end.next = head;
        return p;
    }
}

 

你可能感兴趣的:(算法,算法)