leetcode: rotate-list:旋转链表

题目描述:

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

For example:
Given1->2->3->4->5->NULLand k =2,
return4->5->1->2->3->NULL.

题目解析:

题目的意思是:给定一个链表,将链表旋转到右边的k个位置,k是非负的。

思路:1.首先遍历一遍链表,求出链表的长度。

2.重置一下k:当k大于链表长度的时候,让k%链表长度,此时k是一个小于len的数。倒数第k个元素,就是正数的(len-k+1)个元素,从头结点走到该元素,需要走len-k步。

3.将链表的首尾相连一下,尾节点指向头结点。从尾节点开始走len-k步,就到了倒数第k个元素的前一个节点。新链表的头结点就是倒数第k个节点,并将倒数第k个节点的前一个节点置空。

AC代码:

/**
 * 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 || k == 0)
            return head;
        ListNode* cur = head;
        int len = 1;
        while(cur->next)
        {
            len++;
            cur = cur->next;
        }
        //此时cur指向最后一个节点
        k = len - (k % len);
        //首尾相连一下
        cur->next = head;
        for(int i = 0;i < k;++i)
        {
            cur = cur->next;
        }
        //新的头结点:
        head = cur->next;
        //cur指向此刻的尾,置空一下
        cur->next = NULL;
        return head;
    }
};

(*^▽^*)

猜你喜欢

转载自blog.csdn.net/Qiana_/article/details/81488907
今日推荐