LeetCode 25. K 个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

做这道题目的时候错了几次,这道题目不难,关键点是对细节和边界条件的处理。这道题目基本是反转链表的变形。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
  ListNode* reverseKGroup(ListNode* head, int k) {
    if (head == nullptr) return head;
    using lp = ListNode*;
    lp t1, t2, tmp, t3 = head, pt = nullptr;
    int cnt = 0;
    while (true && t3 != nullptr)
      {
	t2 = t1 = t3;
	for (int i = 0; i < k - 1; i++)
	  {
	    t2 = t2->next;
	    if (t2 == nullptr) break;
	  }
	if (t2 == nullptr) {
	  if (pt != nullptr)
	    pt->next = t1;
	  break;
	}
	if (pt != nullptr)
	  pt->next = t2;

	if (t1 == head)
	  head = t2;
	t3 = t2->next;

	lp p1, p2, p3;
	p1 = t1;
	p2 = p1->next;

	while (p1 != t2)
	  {
	    p3 = p2->next;
	    p2->next = p1;
	    p1 = p2;
	    p2 = p3;
	  }
	pt = t1;

	if (t3 == nullptr)
	  {
	    pt->next = nullptr;
	    break;
	  }
      }

    return head;
  }
};

这种题目应该达到的程度是:一次写对,能够考虑到所有的边界条件,然而我现在还不能做到,之后(等把现在的做法忘记了之后)试一试。

comments powered by Disqus