Rotate List [leetcode] 的两个思路

本文介绍了一种优化的链表右移K位算法,通过两种思路实现:第一种是逐个节点遍历,计算链表长度并进行移动;第二种是先找到末尾节点,再定位到正确位置进行链接。该算法适用于链表操作中的频繁右移需求,提高效率。

第一个思路是先让end从头开始走k+1步;

然后再让lastK从头开始和end一起走到尾部;

最后处理并返回lastK->next。

 ListNode *rotateRight(ListNode *head, int k) {
        if (head == NULL || head->next == NULL) return head;
        ListNode * end = head;
        ListNode * lastK = head;
        //find last but k+1 nodes
        for (int i = 0; i < k; i++)
            if (end->next) end = end->next;
            else end = head;
        if (end == head) return head;
        while (end->next)
        {
            lastK = lastK->next;
            end = end->next;
        }
        //set as head
        end->next = head;
        head = lastK->next;
        lastK->next = NULL;
        return head;
    }

第二种思路是先让ptr走到尾部,并记录链表的长度n;

之后让ptr和head同时走n-(k%n)步,并返回head

ListNode *rotateRight(ListNode *head, int k) {
		int n = 1;
		ListNode *tail = head;
		if (tail == 0)
			return 0;
		while (tail->next)
		{
			tail = tail->next;
			n++;
		}
		tail->next = head;
		k = n - k % n;
		while (k--)
		{
			head = head->next;
			tail = tail->next;
			n--;
		}
		tail->next = 0;
		return head;
	}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值