LeetCode第25题

LeetCode第25题:k个为一组,翻转链表

题目详述

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

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

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

解法一

迭代。时间复杂度:O(n),空间复杂度:O(1)

class Solution {
	public ListNode reverseKGroup(ListNode head, int k) {
		ListNode dummy = new ListNode(-1);
		dummy.next = head;
		ListNode prev = dummy, end = dummy;
		while (end.next != null) {
			for (int i = 0; i < k && end != null; i++) end = end.next;
			if (end == null) break;
			ListNode start = prev.next;
			ListNode next = end.next;
			end.next = null;
			prev.next = reverse(start);
			start.next = next;
			prev = start;
			end = start;
		}
		return dummy.next;
	}
	public ListNode reverse(ListNode head) {
		ListNode prev = null;
		ListNode curr = head;
		while (curr != null) {
			ListNode next = curr.next;
			curr.next = prev;
			prev = curr;
			curr = next;
		}
		return prev;
	}
}

解法二

栈。时间复杂度O(n),空间复杂度:O(1)

class Solution {
	public ListNode reverseKGroup(ListNode head, int k) {
		Deque<ListNode> stack = new ArrayDeque<>();
		ListNode dummy = new ListNode(-1);
		ListNode p = dummy;
		while (true) {
			int count = 0;
			ListNode next = head;
			while (next != null && count < k) {
				stack.add(next);
				next = next.next;
				count ++;
			}
			if (count != k) {
				p,next = head;//为了满足只有一组数据且不够翻转的情况
				break;
			}
			while (!stack.isEmpty()) {
				p.next = stack.pollLast();
				p = p.next;
			}
			p.next = next;
			head = next;
		}
		return dummy.next;
	}
}
发布了40 篇原创文章 · 获赞 0 · 访问量 654

猜你喜欢

转载自blog.csdn.net/weixin_42610002/article/details/104203353