java 单链表逆序_将单链表的每K个节点之间逆序

import java.io.*;

public class Main {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int n = Integer.parseInt(br.readLine().trim());

String[] rawInput = br.readLine().trim().split(" ");

int k = Integer.parseInt(br.readLine().trim());

// 构建链表

Node head = buildLinkedList(rawInput);

// 按要求逆序链表

head = reverseKList(head, k);

// 打印链表

printLinkedList(head);

br.close();

}

private static Node reverseKList(Node head, int k) {

if (null == head || k <= 1) {

return head;

}

Node newHead = null, curNode = head, preNode = null, next = null;

int cnt = k;

Node lastStartNode = head;

Node nextCurNode = head;

while (null != curNode) {

if (cnt-- > 0) {

// 正常反转

next = curNode.next;

curNode.next = preNode;

preNode = curNode;

curNode = next;

} else {

cnt = k;

if (null == newHead) {

newHead = preNode;

lastStartNode = head;

} else {

lastStartNode.next = preNode;

lastStartNode = nextCurNode;

}

nextCurNode = curNode;

preNode = null;

}

}

if (cnt == 0) {

lastStartNode.next = preNode;

return newHead;

}

// 最后不够k个节点了

curNode = preNode;

Node tmpPreNode = null;

while (null != curNode) {

next = curNode.next;

curNode.next = tmpPreNode;

tmpPreNode = curNode;

curNode = next;

}

lastStartNode.next = tmpPreNode;

return newHead;

}

// 打印链表

private static void printLinkedList(Node head) {

StringBuilder sb = new StringBuilder();

while (null != head) {

sb.append(head.value).append(" ");

head = head.next;

}

System.out.print(sb.toString().trim());

}

private static Node buildLinkedList(String[] rawInput) {

Node head = null, curNode = null;

for (int i = 0; i 

Node tmpNode = new Node(Integer.parseInt(rawInput[i]));

if (null == head) {

head = tmpNode;

} else {

curNode.next = tmpNode;

}

curNode = tmpNode;

}

return head;

}

}

class Node {

public int value;

public Node next;

public Node(int value) {

this.value = value;

this.next = null;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值