LeetCode-Algorithms-[Hard][A]25. K 个一组翻转链表

这题非常适合拿来当练习题

详细题解来源:(转载)

图解k个一组翻转链表

k个一组翻转链表.png

	public ListNode reverseKGroup(ListNode head, int k) {
		ListNode temp = new ListNode(0);// 引入头结点方便所有结点的统一处理,不需要对第一个k进行特殊处理
		temp.next = head;
		ListNode crrNode = temp;
		ListNode preNode = temp;
		while (true) {
			for (int i = 0; i < k && crrNode != null; ++i) {
				crrNode = crrNode.next;
			}
			if (crrNode == null) {
				break;
			}
			ListNode begin = preNode.next;
			ListNode next = crrNode.next;
			preNode.next = reverse(begin, crrNode);
			begin.next = next;
			preNode = begin;
			crrNode = begin;
		}
		return temp.next;
	}

	private ListNode reverse(ListNode begin, ListNode end) {
		end.next = null;
		ListNode preNode = null;
		ListNode crrNode = begin;
		while (crrNode != null) {
			ListNode nextNode = crrNode.next;
			crrNode.next = preNode;
			preNode = crrNode;
			crrNode = nextNode;
		}
		return preNode;// 返回逆置后的尾部结点
	}

相比起原解法,多封装了一个end的null处理,while的条件也没必要进行判断,直接true即可。这样代码思路会更清晰

比较需要技巧的是注意倒置和不要断链

这个解法还可以进行优化,即直接翻转,如果最后一个不到k段,还原即可。

但个人觉得,作为一个通用解法,这是一个适合于上机和面试的比较好的思路,首先是比较基本的链表逆置reverse函数,可以作为本题的一个基准

就像我们组装电脑一样,真在面试和上机过程中,成熟的稳定的组装更有助于解题

猜你喜欢

转载自blog.csdn.net/m0_37302219/article/details/106254468