旋转链表20201224

0.题目

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

示例 1:

	输入: 1->2->3->4->5->NULL, k = 2
	输出: 4->5->1->2->3->NULL
	解释:
	向右旋转 1: 5->1->2->3->4->NULL
	向右旋转 2: 4->5->1->2->3->NULL

示例 2:

	输入: 0->1->2->NULL, k = 4
	输出: 2->0->1->NULL
	解释:
	向右旋转 1: 2->0->1->NULL
	向右旋转 2: 1->2->0->NULL
	向右旋转 3: 0->1->2->NULL
	向右旋转 4: 2->0->1->NULL

1.解题

1.1分析

主要思路:向右旋转的意思就是倒数第K个节点作为新的头结点,尾节点与原头结点连接,作为一个完整的链表返回。

  • 因为K可能大于链表长度,所以尽量控制移动的长度在链表长度范围内,所以需要对链表长度取余;
  • 那么自然需要计算链表的长度num;计算k的值,范围为[0, num];
  • 通过双指针找到倒数第k个节点;快指针到达尾部,慢指针则到达倒数第K个节点;
  • 尾节点指向原头结点;返回慢指针指向的节点;
    示意图

1.2代码

// 主要思路是找到倒数第k个节点,然后把该节点作为头结点返回;
public ListNode rotateRight(ListNode head, int k) {
	if (head == null || k <= 0) return head;
	// 统计节点个数,对K取模;减少K值重复循环
	ListNode cur = head;
	int num = 1;
	while (cur.next != null) {
		cur = cur.next;
		num++;
	}
	k = k % num;
	
	// 通过双指针,找到倒数第k个节点
	ListNode pre = new ListNode(0);
	pre.next = head;
	ListNode low = pre;
	ListNode fast = pre;
	while (fast != null && k > 0) {
		fast = fast.next;
		k--;
	}
	
	// 快慢指针同时出发,快指针到尾部
	while (fast.next != null) {
		low = low.next;
		fast = fast.next;
	}
	// 慢指针指向的则是新的头指针
	fast.next = pre.next;
	pre.next = low.next;
	// 断链
	low.next = null;
	
	return pre.next;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值