61.旋转链表(leetcode)

1、思路

先进行一次遍历获取链表长度,并将链表头尾相接成环;
第二次遍历,将遍历的指针指向新的头结点的前一个节点,再断开环

2、代码实现(C++)

/**
 * 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;
        }
        // 求链表长度
        int l = 1;
        ListNode* p = head;
        while (p->next != NULL) {
            p = p->next;
            l++;
        }
        p->next = head;  // 头尾相接,此时 p 指向尾节点
        k = k % l;
        for (int i = 0; i < l-k; i++) {
            p = p->next;
        }                   // 将指针移到旋转后的头结点的前一个节点
        head = p->next;     // 保存头节点
        p->next = NULL;     // 断开环
        return head;
    }
};

你可能感兴趣的:(61.旋转链表(leetcode))