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

题意

把链表分成左右半区,奇数个节点则右半区长一点,重新交叉排列成链表,如下例:
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;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/10961555.html

时间: 2024-11-14 03:43:45

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

算法总结之 按照左右半区的方式重新组合单链表

把链表右边的 拿过来以此插入到左边的链表 思路: 如果链表长度为N,直接给出时间复杂度为O(N) 额外空间复杂度为O(1)的方法 1 如果链表为空,或者长度为1 不调整 2 链表长度大于1时, 遍历一便找到左半区最后一个节点 记为mid package TT; public class Test115 { public class Node{ public int value; public Node next; public Node(int data){ this.value=data; }

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

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

问题描述 public class Node { public int val; public Node next; public Node rand; public Node(int data) { this.val=data; } } Node类中的value是节点值,next指针和正常单链表中next指针的意义一样,都指向下一个节点,rand指针是Node类中新增的指针,这个指针可能指向链表中的任意一个节点,也可能指向null. 给定一个由Node节点类型组成的无环单链表的头节点head,

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

题意 给定一个无序单链表的头节点head,实现单链表的选择排序. 题解 按选择排序方法:每次从原链表找出最小值,从原链表删除,插入新的有序链表. 时间复杂度O(n^2) 额外空间复杂度O(1) 代码 public class Main { public static void main(String args[]) { Node n1=new Node(2); Node n2=new Node(1); Node n3=new Node(3); n1.next=n2; n2.next=n3; No

左神算法书籍《程序员代码面试指南》——2_07将单向链表按某值划分成左边小、中间相等、右边大的形式

Problem:[题目] 给定一个单向链表的头节点head,节点的值类型是整型,再给定一个整数pivot. 实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot的节点, 中间部分都是值等于pivot的节点,右部分都是值大于 pivot的节点. 除这个要求外,对调整后的节点顺序没有更多的要求. 例如:链表9->0->4->5->1,pivot = 3. 调整后链表可以是1->0->4->9->5, 可以是0->1->9->5-&g

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

题意 如题 题解 使用HashSet. 时间复杂度O(n),额外空间复杂度O(n). todo 使用选择排序也可以做. 代码 import java.util.HashSet; public class Main { public static void main(String args[]) { //测试 Node n1=new Node(2); Node n2=new Node(2); Node n3=new Node(3); n1.next=n2; n2.next=n3; Node hea

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

题意 给定非递减循环链表的头节点,和一个待插入的值,将其插入循环链表. 题解 遍历一遍,找到插入位置则返回:若没找到,说明插到头节点尾节点间,注意区分插入的是最大值还是最小值,返回的头节点不一样. 代码 public class Main { public static void main(String args[]) { //test Node n1=new Node(1); Node n2=new Node(1); Node n3=new Node(3); n1.next=n2; n2.ne

左神算法书籍《程序员代码面试指南》——2_06判断一个链表是否为回文结构

[题目]给定一个链表的头节点head,请判断该链表是否为回文结构.例如:1->2->1,返回true.1->2->2->1,返回true.15->6->15,返回true.1->2->3,返回false.进阶:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]方法一:遍历一遍链表,将数据压入栈中然后再遍历一遍链表与栈的弹出数据对比方法二:使用快慢指针,将链表的前部分压入栈,然后栈数据弹出与链表的后半部分对比方法三:使用快慢指

《程序员代码面试指南》第八章 数组和矩阵问题 将正方形矩阵顺时针转动90

题目 将正方形矩阵顺时针转动90 java代码 package com.lizhouwei.chapter8; /** * @Description: 将正方形矩阵顺时针转动90 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:16 * @Modify by: * @ModifyDate: */ public class Chapter8_2 { public void rotate(int[][] matrix) { int tR = 0; i