-
实例要求:
-
1、给定一个
链表的头节点 head
,请你旋转链表
,将链表每个节点
向右移动 k 个位置
; -
2、链表中
节点的数目的范围为[0, 500]
; -
实例分析:
-
1、入参合理性检查,即
head != NULL || head->next != NULL || k != 0
; -
2、
while循环
找到链表的最后一个节点
; -
3、
单向链表首尾相连
,形成单向循环链表,即tail->next = head
; -
4、每个元素向右移动完成后,
单向循环链表恢复为单向链表
即可; -
相关案例:
-
示例代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* rotateRight(struct ListNode* head, int k)
{
if(head == NULL || head->next == NULL || k == 0)
{
return head;
}
struct ListNode *tail = head;
int len = 1;
//找到链表的最后一个节点
while(tail->next != NULL)
{
len++;
tail = tail->next;
}
//首尾相连,形成循环链表
int i = len - k%len;
tail->next = head;
while(i--)
{
tail = tail->next;
}
head = tail->next;
tail->next = NULL;
return head;
}
- 运行结果: