仅供自己学习记录
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