给出一个列表,将列表向右旋转k个地方,其中k是非负数。

来源:互联网 发布:网络视频节目许可证 编辑:程序博客网 时间:2024/06/05 04:21

本题源自leetcode  61

-----------------------------------------------------------

思路:遍历一遍链表统计长度以及找到链表尾节点。

2 将链表构造成一个环,然后找到要转换的节点的头结点,断开。

代码:

 ListNode* rotateRight(ListNode* head, int k) {        if(!head || k == 0)            return head;        int len = 1;        ListNode* p = head;        while(p->next){            p = p->next;            len++;        }        p->next = head;  //构成一个环        if(k %= len){            for(int i = 0; i < len - k; i++)                p = p->next;         }        ListNode* pre = p->next;        p->next = NULL;        return pre;    }

思路2 用快慢指针,让快指针先走k步,然后满指针开始走,快指针走到尾节点,慢指针则走到倒数第k个节点的前一个节点。

 ListNode* rotateRight(ListNode* head, int k) {        if(!head || k == 0)            return head;        int len = 0;        ListNode* p = head;        while(p){            p = p->next;            len++;        }        k %= len;        ListNode* root = new ListNode(0);        root->next = head;        ListNode* pre = head;        ListNode* post = head;        while(pre && k > 0){            pre = pre->next;            k--;        }        while(pre->next && post){            pre = pre->next;            post = post->next;        }        pre->next = root->next;        root->next = post->next;        post->next = NULL;        return root->next;    }


阅读全文
0 0
原创粉丝点击