LeetCode刷题日记2021-3-27/61.旋转链表/双指针定位

仅供自己学习记录

Leetcode每日一题 2021-3-27

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

在这里插入图片描述

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

在这里插入图片描述

输入:head = [0,1,2], k = 4
输出:[2,0,1]

解题思路来自负雪明烛大佬

解题思路:

将链表的每个节点向右移动K个位置,相当于把链表后k%len个节点移动到链表最前端

1.求出链表长度
定义cur指针指向头节点,计数器
2.找出倒数k+1个节点
定义快慢两个指针fast,slow指向头部
先将fast向后移动k个节点 此时fast跟slow相距k个节点 fast指向第k+1个节点
当fast.next存在时 fast跟slow同时后移
当fast指向尾部时 slow.next为倒数第k个节点

3.链表重整:将链表倒数第k+1个节点和倒数第k个节点断开,并且把后半部分拼接到头部
将slow.next指向为空
fast.next指向头部

题解代码如下:

Definition for singly-linked list.
class ListNode:
def init(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
#链表为空或者为单节点
if not head or not head.next:
return head
len=0
cur=head
#计算链表长度
while cur:
len+=1
cur=cur.next
#计算向右移动步长
k%=len
if k==0:
return head
#定义快慢指针且快指针先走K%len步
fast,slow=head,head
while k:
fast=fast.next
k-=1
while fast.next:
slow=slow.next
fast=fast.next
#慢指针此时所对应的节点正为尾节点且慢指针的下个节点正是新链表的头节点快指针下个节点对应节点为头节点
newhead=slow.next
slow.next=None
fast.next=head
return newhead

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值