给定一个单向链表的头节点head,并给定旋转次数n,将链表每个节点向左旋转n个位置。 python
时间: 2024-10-21 11:14:09 浏览: 13
在Python中,我们可以使用迭代的方式来解决这个问题。首先,我们需要确定链表是否进行了旋转,然后创建一个新的链表,将原链表分为两部分,分别是未旋转的部分和已旋转的部分。对于已旋转部分,我们将其反转后再连接到未旋转部分。以下是具体的步骤:
1. 初始化两个指针`prev`和`curr`,它们都指向头节点`head`。
2. 当`prev`和`curr`相遇时,说明已经找到了未旋转部分的结束(因为它们在第一次相遇时,`prev`位于旋转后的起始位置,而`curr`经过了n次移动到达了原起始位置)。
3. 记录`curr`的位置作为新的头节点,因为这是原链表的新起点。
4. 将`prev`设置为新头节点,`curr`设置为其下一个节点,这样`curr`现在就是已旋转部分的开始。
5. 反转已旋转部分,即交换`prev`和`curr`的节点值,直到`curr`为空。
6. 最后返回新头节点。
这里是对应的Python代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def rotateRight(head, n):
if not head or not head.next or n == 0:
return head
# 找到链表的长度
length = 1
curr = head
while curr.next:
length += 1
curr = curr.next
# 分别找到旋转前的头和新头
prev = None
for _ in range(length - n):
prev = prev.next
new_head = prev.next
# 将剩余部分反转
curr = prev.next
prev.next = None
while curr != new_head:
temp = curr.next
curr.next = prev
prev = curr
curr = temp
# 更新新头
new_head.next = head
return new_head
# 示例
# 输入: 1->2->3->4->5->NULL, n = 2
# 输出: 4->5->1->2->3->NULL
```
阅读全文