首页 > 其他分享 >K 个一组翻转链表

K 个一组翻转链表

时间:2022-12-08 17:24:07浏览次数:38  
标签:head ListNode 一组 next 链表 start end 节点 翻转

一、原题

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
在这里插入图片描述
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
示例 2:
在这里插入图片描述
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-nodes-in-k-group

二、解法

1、分析

本题需要实现组内反转,如果不够一组,就不进行反转
首先设置链表头,可以先确定是否能找到组内尾节点,找不到直接返回,找到的话,直接设置该节点为头(因为反转后,尾巴就变成了开头),然后进行组内反转,并连接下一组的头节点,到此已经完成了第一步,即设置头,并且完成第一组反转;进行第二组操作,还是先找组内尾结点,然后组内反转,并连接下一组的头节点,进行第三组操作…依次这样操作,直到没有下一组,直接返回

2、解答

题中使用的链表结构

public static class ListNode {
	int val;
	ListNode next;

	ListNode() {
	}

	ListNode(int val) {
		this.val = val;
	}

	ListNode(int val, ListNode next) {
		this.val = val;
		this.next = next;
	}
}

代码实现

public class ReverseKGroup {

	/**
	 * 假设链表为1-2-3-4-5,k=2
	 */
	public static ListNode reverseKGroup(ListNode head, int k) {
		if (head == null) {
			return null;
		}
		// statr:1-2-3-4-5
		// end:2-3-4-5
		ListNode start = head;
		ListNode end = getLastNode(head, k);

		// 表示没找到符合的一组,不反转,直接返回
		if (end == null) {
			return head;
		}

		reverse(start, end);
		// statr:1-3-4-5
		// end:2-1-3-4-5

		// 设置头节点:即第一组反转后的头(原组的尾)
		head = end;
		
		// 上一组的尾巴
		ListNode lastEnd = start;
		while (lastEnd.next != null) {
			start = lastEnd.next;
			end = getLastNode(start, k);
			if (end == null) {
				return head;
			}
			reverse(start, end);
			lastEnd.next = end; // 上一组连接上当前组
			lastEnd = start;
		}
		return head;
	}

	/**
	 * 找到最后一个节点
	 */
	private static ListNode getLastNode(ListNode head, int k) {
		while (--k > 0 && head != null) {
			head = head.next;
		}
		return head;
	}

	/**
	 * 开始和结束节点之前翻转,然后连接下一组节点开头
	 */
	public static void reverse(ListNode start, ListNode end) {
		end = end.next; // 结束节点,该节点不需要反转
		ListNode cur = start; // 需要一个索引去遍历,start还是指向原来的头,方便最后链接下一组的头
		ListNode pre = null;
		ListNode next = null;
		while (cur != end) {
			next = cur.next;
			cur.next = pre;
			pre = cur;
			cur = next;
		}
		start.next = end;
	}
	
}

Markdown 1770 字数 112 行数 当前行 85, 当前列 54 HTML 1580 字数 93 段落

标签:head,ListNode,一组,next,链表,start,end,节点,翻转
From: https://www.cnblogs.com/huozhonghun/p/16966647.html

相关文章

  • 朝花夕拾-链表(二)
    "Goodcodeisitsownbestdocumentation."-SteveMcConnell“好代码本身就是最好的文档。”——史蒂夫·麦克康奈尔0x00大纲目录0x00大纲0x01前言数据与结......
  • 每日算法之二叉搜索树与双向链表
    JZ36二叉搜索树与双向链表描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表注意:1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成......
  • python初步了解链表
    python数据结构——链表链表由一个个节点组成,每个节点包含自己的存储数据和下一个节点。单链表简单实现先创造一个类来表示节点与节点之间的关系classNode:def......
  • 嵌入式-链表尾插法插入
    链表通过尾部插入#include<stdio.h>#include<stdlib.h>structTest{intdata;structTest*next;};printfLink(structTest*head){while(head!=NUL......
  • 数据结构:静态查找表(线性链表)
    /***********************************************************     程序:静态查找表(线性链表)*************************......
  • 朝花夕拾-链表(一)
    "WritinginCorC++islikerunningachainsawwithallthesafetyguardsremoved."-BobGray“用C或C++写代码就像是在挥舞一把卸掉所有安全防护装置的链锯。......
  • 嵌入式-删除链表节点
    删除链表节点可以分为三种:删除头节点,删除中间节点和删除尾节点#include<stdio.h>#include<stdlib.h>structTest{intdata;structTest*next;};printfLin......
  • 链表从指定前方插入节点
    在链表的前方插入节点#include<stdio.h>structTest{intdata;structTest*next;};printfLink(structTest*head){while(head!=NULL){p......
  • 链表
    链表链表算法与数据结构目录这一节将着重知识讲解与代码实践链表的理论基础链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域......
  • 151.翻转字符串里的单词
    151.翻转字符串里的单词力扣题目链接(opensnewwindow)给定一个字符串,逐个翻转字符串中的每个单词。示例1:输入:"theskyisblue"输出:"blueisskythe"示例2:......