思路是先把字符串分为两个链,后一个链反转,然后合并两个链。这里面涉及了三个比较常见的操作第一:如何通过数组构建链表,第二:如何通过数组构建反向链表,第三:如何合并两个链表为一个链表(五指针)
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
ListNode head = reverse(s);
while(head != null){
if(head.next == null){
System.out.print(head.val);
}else{
System.out.print(head.val+",");
}
head = head.next;
}
}
public static ListNode reverse(String s){
String[] a = s.split(",");
if(a.length == 1){
return new ListNode(Integer.valueOf(a[0]));
}
ListNode tmp = new ListNode();
ListNode head1 = new ListNode();
ListNode head2 = new ListNode();
//反转使用的哑节点
ListNode dummy = new ListNode(0);
//构建两个链表
for(int i = 0;i<a.length;i++){
//前半段
if(i<a.length-a.length/2){
ListNode listnode = new ListNode(Integer.valueOf(a[i]));
if(i == 0){
head1 = listnode;
tmp = head1;
}else{
tmp.next = listnode;
tmp = tmp.next;
}
}else{//后半段反转构建
ListNode listnode = new ListNode(Integer.valueOf(a[i]));
//先找到头节点
if(i == a.length-a.length/2){
head2 = listnode;
}else{
//新产生的节点next指向链表
listnode.next = head2;
head2 = listnode;
}
}
}
//合并两个链表
int flag = 0;
ListNode head = new ListNode();
head = head1;
ListNode tmp2 = new ListNode();
//head1 tmp
//head2
while(head2!=null){
tmp = head1.next;
tmp2 = head2.next;
head1.next = head2;
head2.next = tmp;
head1 = tmp;
head2 = tmp2;
}
return head;
}
}
class ListNode{
int val;
ListNode next;
public ListNode(){
}
public ListNode(int val){
this.val = val;
}
}