leetcode C++ 25. K 個一組翻轉鏈表 給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。

一、思路:

      先實現兩個節點翻轉,再實現k個節點翻轉,最後實現一組一組翻轉

二、C++代碼:



class Solution {
public:
	ListNode* swap(ListNode *f1, ListNode *f2, int count) {
		ListNode *nowNode = f2;
		ListNode *f3, *l1, *l2 = NULL, *l3;
		while (--count > 0) {
			if (nowNode->next == NULL) //表明鏈表不足k位
				return NULL;
			else if (count == 1) {
				l2 = nowNode->next;
				l1 = nowNode;
				l3 = l2->next;
				f3 = f2->next;

				f2->next = l3;
				if (l1 == f2)
					l2->next = f2;
				else {
					l1->next = f2;
					l2->next = f3;
				}
				if (f1 != NULL)
					f1->next = l2;
				return l2;
			}
			nowNode = nowNode->next;
		}
		return l2;
	}

	ListNode *swapKNodes(ListNode *f1, ListNode *f2, int k) {
		ListNode *nowNode = NULL;
		ListNode *parent = f2;
		for (int i = k; i > 1; i -= 2) {
			if (i == k) {
				f2 = swap(f1, f2, i);
				nowNode = f2;
			}
			else {
				nowNode->next = swap(nowNode, nowNode->next, i);
				nowNode = nowNode->next;
			}
		}
		return f2;
	}
	ListNode* reverseKGroup(ListNode* head, int k) {
		if (k <= 1)
			return head;

		ListNode *nowNode = head, *f1 = NULL, *f2 = head, *l2 = NULL;

		int count = 0;
		while (nowNode != NULL) {
			if (count%k == k - 1) {
				nowNode = f2;
				if (count == k - 1) {
					head = f2 = swapKNodes(f1, f2, k);
				}
				else {
					f2 = swapKNodes(f1, f2, k);
				}
				f1 = f2;
				f1 = nowNode;
			}
			else if (count%k == 0) {
				f2 = nowNode;
			}
			count++;
			nowNode = nowNode->next;
		}
		return head;
	}
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章