[程序员代码面试指南]链表问题-按照左右半区的方式重新组合单链表

Posted coding-gaga

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[程序员代码面试指南]链表问题-按照左右半区的方式重新组合单链表相关的知识,希望对你有一定的参考价值。

题意

把链表分成左右半区,奇数个节点则右半区长一点,重新交叉排列成链表,如下例:
1,2,3,4,5,# =>1,3,2,4,5,#
1,2,3,4,#=>1,3,2,4,#

题解

找到分割点,拆开再合并。

代码

public class Main 
    public static void main(String args[]) 
        //test
        Node n1=new Node(1);
        Node n2=new Node(2);
        Node n3=new Node(3);
        Node n4=new Node(4);
        n1.next=n2;
        n2.next=n3;
        n3.next=n4;
        Node head=n1;
        
        relocate(head);
        
        //test
        Node pNode=head;
        while(pNode!=null) 
            System.out.println(pNode.val);
            pNode=pNode.next;
        
    
    
    public static void relocate(Node head) 
        if(head!=null&&head.next!=null&&head.next.next!=null) //至少三个节点
            Node fast=head;//
            Node slow=head;
            while(fast.next!=null&&fast.next.next!=null) //
                fast=fast.next.next;
                slow=slow.next;
            
            Node l=head;
            Node r=slow.next;
            slow.next=null;
            Node lTemp=null;
            Node rTemp=null;
            while(r!=null) 
                lTemp=l.next;
                l.next=r;
                l=lTemp;
                
                rTemp=r.next;
                r.next=l;
                r=rTemp;
            
        
    

以上是关于[程序员代码面试指南]链表问题-按照左右半区的方式重新组合单链表的主要内容,如果未能解决你的问题,请参考以下文章

栈和队列----按照左右半区的方式重新组合单链表

[程序员代码面试指南]链表问题-删除无序链表中重复出现的节点

[程序员代码面试指南]链表问题-向有序的环形链表插入新节点

[程序员代码面试指南]链表问题-复制含有随机指针节点的链表(方法二待做)

[程序员代码面试指南]链表问题-单链表的选择排序(选择排序)

程序员代码面试指南第二版 12.打印两个升序链表的公共部分