• Rotate List


    题目链接

    Rotate List - LeetCode

    注意点

    • k可能会大于链表长度

    解法

    解法一:首先遍历一遍链表得到链表的长度,k对其取余数。然后设置快慢指针,快指针先走k步,然后快慢指针一起走,当快指针走到底的时候,慢指针也走到了新的链表头结点的前一个结点,这时候修改快慢指针的指向就好了。时间复杂度O(n)。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* rotateRight(ListNode* head, int k) {
            if(head == NULL) return head;
            int i,n = 0;
            ListNode* p = head;
            while(p != NULL)
            {
                p = p ->next;
                n++;
            }
            //cout << n;
            k %= n;
            ListNode* fast = head;
            ListNode* slow = head;
            while(k > 0)
            {
                fast = fast->next;
                k--;
            }
            //if(fast == NULL) return head;
            while(fast->next != NULL)
            {
                fast = fast->next;
                slow = slow->next;
            }
            fast->next = head;
            fast = slow->next;
            slow->next = NULL;
            return fast;
        }
    };
    

    解法二:同样首先遍历一遍链表得到链表的长度,k对其取余数。将链表尾和链表头相连,然后继续往后遍历(也就是从头开始)n-k个结点,这时正好指向新的链表头结点的前一个结点。时间复杂度O(n)

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* rotateRight(ListNode* head, int k) {
            if(head == NULL) return head;
            int i,n = 1;
            ListNode* p = head;
            while(p->next != NULL)
            {
                p = p ->next;
                n++;
            }
            p->next = head;
            k %= n;
            for(i = 0;i < n-k;i++) p = p->next;
            ListNode* ret = p->next;
            p->next = NULL;
            return ret;
        }
    };
    

    小结

    • 链表题
  • 相关阅读:
    2021年4月27日 团队冲刺阶段01
    2021年4月26日
    2021年4月25日
    2021年4月24日
    2021年4月23日
    2021年4月22日
    2021年4月21日
    神奇的数列之“Last Defence ”
    经典圆交面积求解之“Intersection ”
    计蒜客第六场
  • 原文地址:https://www.cnblogs.com/multhree/p/10443859.html
Copyright © 2020-2023  润新知