0
点赞
收藏
分享

微信扫一扫

程序员代码面试指南第二版 31.按照左右半区的方式重新组合单链表

witmy 2023-01-18 阅读 53


​​welcome to my blog​​

程序员代码面试指南第二版 31.按照左右半区的方式重新组合单链表

题目描述

给定一个单链表的头部节点 head,链表长度为 N,如果 N 是偶数,那么前 N / 2 个节点算作左半区,后 N / 2 个节点算作右半区;如果 N 为奇数,那么前 N / 2 个节点算作左半区,后 N / 2 + 1个节点算作右半区。左半区从左到右依次记为 L1->L2->...,右半区从左到右依次记为 R1->R2->...,请将单链表调整成 L1->R1->L2->R2->... 的形式。

输入描述:
单链表的头节点 head。

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

示例1

输入
6
1 2 3 4 5 6

输出
1 4 2 5 3 6

第一次做; 两个核心. 核心1:找链表左半部分最后一个节点的方法和找链表中间节点的方法非常像, 二者的初始化条件是一样的left=head, right=head.next; 区别在于循环条件不同: right.next!=null, right.next.next!=null; 和 right!=null, right.next!=null; 核心2:merge()方法中的循环条件, 是curr.next!=null, 不是curr!=null; 使用curr!=null无法处理链表节点是奇数个的情况

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(" ");
//create linked list
Node head = new Node(Integer.parseInt(str[0]));
Node curr = head;
for(int i=1; i<n; i++){
curr.next = new Node(Integer.parseInt(str[i]));
curr = curr.next;
}
//execute
if(n==1){
System.out.print(str[0]);
return;
}
//核心1:
Node left=head, right=head.next;
while(right.next!=null && right.next.next!=null){
left = left.next;
right = right.next.next;
}
Node head2 = left.next;
left.next = null;
curr = merge(head, head2);
//print result
while(curr!=null){
System.out.print(curr.val+" ");
curr = curr.next;
}
}
public static Node merge(Node head1, Node head2){
Node curr1 = head1, curr2=head2, next;
//核心2: curr1.next!=null
while(curr1.next!=null){
//save next
next = curr2.next;
//change direction
curr2.next = curr1.next;
curr1.next = curr2;
//update
curr1 = curr2.next;
curr2 = next;
}
curr1.next = curr2;
return head1;
}
public static class Node{
int val;
Node next;
Node(int val){
this.val = val;
}
}
}


举报

相关推荐

0 条评论