0
点赞
收藏
分享

微信扫一扫

程序员代码面试指南第二版 23.将单链表的每K个节点之间逆序


​​welcome to my blog​​

程序员代码面试指南第二版 23.将单链表的每K个节点之间逆序

题目描述

给定一个单链表,实现一个调整单链表的函数,使得每 K 个节点之间的值逆序,如果最后不够 K 个节点一组,则不调整最后几个节点。

输入描述:
第一行一个整数 n,n 表示单链表的节点数量。

第二行 n 个整数 val 表示链表的各个节点的值。

第三行一个整数 K。

输出描述:
在给定的函数内返回链表的头指针。

示例1

输入
5
1 2 3 4 5
3

输出
3 2 1 4 5

第一次做; 核心:找好上一组的最后一个节点, 下一组的第一个节点, 当前组反转后的最后一个节点; 创建临时头结点

import java.util.Scanner;

public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
String[] str = sc.nextLine().split(" ");
int k = Integer.parseInt(sc.nextLine());
//input check
if(n<1 || k<1)
return;
//创建链表
ListNode head = new ListNode(Integer.parseInt(str[0]));
ListNode curr = head;
for(int i=1; i<n; i++){
curr.next = new ListNode(Integer.parseInt(str[i]));
curr = curr.next;
}
//execute
//临时头结点
ListNode temp = new ListNode(0);
temp.next = head;
//上一组的最后一个节点
ListNode pre = temp;
//下一组的第一个节点
ListNode after = pre;
curr = head;
ListNode left = pre, right;
//反转后当前组的最后一个节点
ListNode last;
int count = k;
while(curr!=null){
while(count > 0 && after != null){
after = after.next;
count--;
}
//如果after==null, 说明剩下的节点不够k个了
if(after==null)
break;
//保存下一组的第一个节点
after = after.next;
//重置count
count = k;
//保存反转后的最后一个节点
last = curr;
//翻转当前的k个节点
while(curr!=after){
//save
right = curr.next;
//change
curr.next = left;
//update
left = curr;
curr = right;
}
//上一组的最后一个节点连接反转后的第一个节点
pre.next = left;
//反转后的最后一个节点连接下一组的第一个节点
last.next = after;
//update
pre = last;
after = last;
}
//打印结果
curr = temp.next;
while(curr!=null){
System.out.print(curr.val+" ");
curr = curr.next;
}
}
public static class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val = val;
}
}
}


举报

相关推荐

0 条评论