#25 Reverse Nodes in k-Group

題目鏈接:https://leetcode.com/problems/reverse-nodes-in-k-group/


Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For example,
Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
	if (k <= 1)
		return head;
	struct ListNode* dummy = (struct ListNode *)malloc(sizeof(struct ListNode));
	dummy->next = head;
	struct ListNode* reversedRear = dummy;			//記錄已逆轉鏈表的尾節點
	int len = 0;
	while (reversedRear = reversedRear->next)		//臨時用來計算鏈表的長度
		++len;
	reversedRear = dummy;		//計算完長度後恢復記錄一逆轉鏈表的尾節點
	if (k > len) {				//如果長度len不滿一個處理段(k個),不需要逆轉
		free(dummy);
		return head;
	}
	int pass = len / k;			//有pass段需要逆轉,每趟逆轉一段
	struct ListNode *p, *q, *r;	//三個指針實現鏈表逆轉,分別標記前一個、當前、後一個要處理指針的節點
	while (pass--) {			//每趟逆轉k個節點
		p = head;
		q = p->next;
		for (int i = 1; i < k; ++i) {	//將當前處理段中間的指向逆轉
			r = q->next;
			q->next = p;			//逆轉指針
			p = q;
			q = r;
		}
		reversedRear->next = p;		//將當前處理段連接到已逆轉鏈表尾部
		head->next = q;	        	//將當前處理連接到未處理鏈表
		reversedRear = head;		//更新已逆轉鏈表的尾部
		head = head->next;			//更新未處理表鏈頭部
	}
	reversedRear->next = head;		//將剩餘不滿k個節點鏈表直接連接到已逆轉鏈表尾部
	head = dummy->next;
	free(dummy);
	return head;
}


發佈了96 篇原創文章 · 獲贊 10 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章