Two pointers (1) -- Linked List Cycle II, Rotate List

来源:互联网 发布:重庆网络推广怎样 编辑:程序博客网 时间:2024/06/06 17:16

Linked List Cycle II

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Note: Do not modify the linked list.

Follow up:
Can you solve it without using extra space?

此题之前已有过介绍。 可以看这篇的解释,很详细:点击打开链接


    ListNode *detectCycle(ListNode *head) {        if (head == NULL) return NULL;        ListNode* ptr = head;        ListNode* fastPtr = ptr;        do {            if (fastPtr == NULL || fastPtr->next == NULL)                 return NULL;            ptr = ptr -> next;            fastPtr = fastPtr -> next -> next;        } while (ptr != fastPtr);        ptr = head;        while (ptr != fastPtr){            ptr = ptr -> next;            fastPtr = fastPtr -> next;        }        return ptr;    }



Rotate List

Given a list, rotate the list to the right by k places, where k is non-negative.

For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.

1. 先找出list的长度,然后找到断开处的指针。

2. 使用快慢指针的话并不能减少指针移动的操作,所以不用了


    ListNode* rotateRight(ListNode* head, int k) {        if (head == NULL) return NULL;        int len = 1;        ListNode* ptr = head;        while (ptr -> next != NULL){            ptr = ptr -> next;            len++;        }         ListNode* tail = ptr;         k = k % len;        if (k == 0) return head;        ptr = head;        for (int i = 1; i < len - k; i++){            ptr = ptr -> next;        }        ListNode* newH = ptr -> next;        ptr -> next = NULL;        tail -> next = head;        return newH;    }


0 0