旋转链表

87 阅读1分钟

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

示例 1:

bVcYdvS.png

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

示例 2:

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

提示: 链表中节点的数目在范围 [0, 500] 内 -100 <= Node.val <= 100 0 <= k <= 2 * 109

思路: 将k对链表长度(后记为len)取模,如果k与len相等,则k = len,再进行旋转(余数为多少就旋转多少次)。

获取链表长度(帮助函数):

int length(struct ListNode* p) {
	struct ListNode* q = p;
	int length = 0;

	while (q != NULL) {
		length++;
		q = q->next;
	}

	return length;
}

单次旋转:

void rotate(struct ListNode **p) {
	struct ListNode* q = *p;
	struct ListNode *secondToLast = *p;

	while (q != NULL) {
		if (q->next != NULL) {
			secondToLast = q;
		}
		q = q->next;
	}

	secondToLast->next->next = *p;
	*p = secondToLast->next;
	secondToLast->next = NULL;
}

struct ListNode* rotateRight(struct ListNode* head, int k) {
	int len = length(head);
	if (len == 0 || len == 1) return head;
	int _k;
	if (k % len == 0) {
		_k = len;
	}
	else {
		_k = k % len;
	}

	for (int i = 0; i < _k; i++) {
		rotate(&head);
	}

	return head;
}