LeetCode Rotate List

本文介绍了一种链表右旋算法的具体实现方法。通过计算链表长度并对旋转次数取余,避免了不必要的多次旋转。文章详细展示了如何寻找新的头结点并重新组织链表结构,确保了链表的正确性和连贯性。
 struct ListNode {
      int val;
      ListNode *next;
      ListNode(int x) : val(x), next(NULL) {}
  };

class Solution {
public:
	ListNode* rotateRight(ListNode* head, int k)
	{
		int level = -1;
		int size = 0;
		ListNode *ptr = head;
		while(ptr != nullptr) //一定要找到size,并取余,不然这个算法就是错的
		{
			size++;
			ptr = ptr->next;
		}
		if(size == 0) return nullptr;
		cout << k%size<<endl;
		ListNode *newhead = findNewHead(head, k%size, level);
		ptr = head;
		while( ptr != nullptr)
		{
			if(ptr->next == newhead) ptr->next = nullptr; //要将新的头节点的前前节点设置为nullptr
			ptr = ptr->next;
		}
		ptr = newhead;
		while(ptr != nullptr && ptr->next != nullptr && ptr != head) // Error: 要找到最后一个,再连接到head
			ptr = ptr->next;
		if(ptr!= nullptr && ptr->next == nullptr && ptr != head) ptr->next = head;//Error:要判断ptr是不是head,不然容易产生环状
		if(newhead == nullptr) newhead = head; //newhead返回nullptr时如何处理也非常关键
		return newhead;
	}
	
	ListNode* findNewHead(ListNode * node, int k, int& level)
	{
		ListNode* newhead = nullptr;
		if(node == nullptr) {level = 0; return nullptr;}
		if(level < 0)
			newhead = findNewHead(node->next, k, level);
		if(level == k)
		{
			return newhead; //哪条路径返回什么值也一定要搞清楚
		}
		if(level >= 0) level++;
		return node; //哪条路径返回什么值也一定要搞清楚
	}
};

 

转载于:https://www.cnblogs.com/whyandinside/p/5282039.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值