• 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.

    这里的k可能是比链表长度要大的数字,因此实际旋转的位置就是k%len(list)。如果这个计算结果等于零或者等于len(list),列表是不用旋转的。

    接下来如果是事例给出的正常情况,那么有三步就能完成旋转。

    (1)第一个辅助指针从头开始后移k个位置。

    (2)这时第二个辅助指针指向头指针,然后两个指针同时向后移动,直到第一个辅助指针指向尾节点。

    (3)声明第三个辅助指针指向第二个辅助指针的后继结点作为将要返回的新头指针。把第二个指针的后继设为空指针,同时将第一个指针的后继指向原先的有指针。这儿样就能完成指针的旋转。

    这里从网上看到一个最简洁的方法,直接把尾指针指向头,构成一个循环链表,这样,循环链表直接移K位就行了

    需要注意的是,最后的尾节点要赋值为NULL,需要特别注意的是循环链表向后移位的步数不是K,而是len-k%len(为什么???答:注意审题啊,题目说的是右K位,

    所以从左要移动len-k%len位)。

    /**
     * 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 NULL;
        ListNode *p=head;
        int n=0;
        while(p->next)
        {
          p=p->next;
          n++;
        }
        n++;
        k=k%n;
        p->next=head;
        ListNode *q=head;
        for(int i=0;i<n-k-1;i++)
        q=q->next;
        head=q->next;
        q->next=NULL;    
        return head;
            
        }
    };

    python版本

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    class Solution:
        # @param {ListNode} head
        # @param {integer} k
        # @return {ListNode}
        def rotateRight(self, head, k):
            len=0
            flag=ListNode(0)
            flag.next=head
            while flag.next!=None:
                flag=flag.next
                len+=1
            if len==0 or k==0:
                return head
            k=len-k%len
            flag.next=head
            while k>0:
                flag=flag.next
                k-=1
            head=flag.next
            flag.next=None
            return head
            
  • 相关阅读:
    Functional Programming Contest
    CodeChef--SEPT14小结
    Weekly 10 小结
    CSS中的 REM PX EM
    phoenegap3.5 采坑
    PPT插件 用js制作PPT
    js 代码命名规范系列
    文档列表
    mockjax MOCK.js的拦截ajax请求
    css Tab选项卡
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/4567307.html
Copyright © 2020-2023  润新知