LeetCode 61. Rotate List(循环右移单链表)

本文介绍了一种解决链表循环右移问题的方法。通过计算链表长度并利用指针操作,实现了链表的有效循环右移。该算法的时间复杂度为O(n),适用于面试和技术交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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

例子:

Given 1->2->3->4->5->NULL and k = 2,

return 4->5->1->2->3->NULL.

分析:

    题意:给定一个单链表,返回将它循环右移k(k是非负整型数)次的结果。

LeetCode 61

    思路:我们首先计算单链表的结点个数n。因为可能存在k > n的情况,先进行取模计算k = k % n。初始化指针pre = head、p = head、q = head。接下来分为三步走:① 将指针q往右移动k次;② 在指针q指向结点的next指针不为空时,同时向右移动指针pre和指针q,那么指针pre就指向了返回单链表首结点的前驱结点;③p = pre->next指向返回单链表的首结点,pre->next = NULL使得指针pre指向结点为新的尾结点,q->next = head进行重新连接,返回指针p即可 。
    时间复杂度为O(n)。

代码:

#include <bits/stdc++.h>

using namespace std;

struct ListNode{
	int val;
	ListNode *next;
	ListNode(int x): val(x), next(NULL){}
};

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
		// Exceptional Case: 
        if(!head || !head->next || k == 0){
			return head;
		}
		// cnt
		int n = 0;
		ListNode *pre = head, *p = head, *q = head;
		while(p){
			n++;
			p = p->next;
		}
		k = k % n;
		// check important!
		if(k == 0){
			return head;
		}
		for(int i = 1; i <= k; i++){
			q = q->next;
		}
		while(q->next){
			pre = pre->next;
			q = q->next;
		}
		p = pre->next;
		pre->next = NULL;
		q->next = head;
		return p;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值