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

题意

给定一个无序单链表的头节点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;
        Node head=n1;

        Node sortHead=selectSort(head);
        Node pNode=sortHead;
        while(pNode!=null) {
            System.out.println(pNode.val);
            pNode=pNode.next;
        }
    }

    public static Node selectSort(Node head) {
        Node cur=head;//无序链表头
        Node small=null;//最小节点
        Node smallPre=null;
        Node tail=null;//有序链表结尾
        while(cur!=null) {
            //从原链表找small及删small节点
            smallPre=getSmallPreNode(cur);
            if(smallPre==null) {
                small=cur;
            }
            else {
                small=smallPre.next;
                smallPre.next=small.next;//删除small节点
            }

            //更新cur节点
            cur=cur==small?cur.next:cur;

            //把small节点插入有序链表
            if(tail==null) {
                head=small;
            }
            else {
                tail.next=small;
            }
            tail=small;
        }
        return head;
    }

    public static Node getSmallPreNode(Node head) {
        Node small=head;
        Node smallPre=null;
        Node cur=head.next;
        Node pre=head;
        while(cur!=null) {
            if(cur.val<small.val) {
                small=cur;
                smallPre=pre;
            }
            pre=pre.next;
            cur=cur.next;
        }
        return smallPre;
    }
}

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

时间: 2024-08-02 06:09:29

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

《程序员代码面试指南》第八章 数组和矩阵问题 需要排序的最短子数组长度

题目 需要排序的最短子数组长度 java代码 package com.lizhouwei.chapter8; /** * @Description: 需要排序的最短子数组长度 * @Author: lizhouwei * @CreateDate: 2018/4/29 8:03 * @Modify by: * @ModifyDate: */ public class Chapter8_5 { public int getMinLength(int[] arr) { if (arr == null

程序员代码面试指南 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,

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

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

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

题意 如题 题解 使用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).[题解]方法一:遍历一遍链表,将数据压入栈中然后再遍历一遍链表与栈的弹出数据对比方法二:使用快慢指针,将链表的前部分压入栈,然后栈数据弹出与链表的后半部分对比方法三:使用快慢指

左神算法书籍《程序员代码面试指南》——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

《程序员代码面试指南》第八章 数组和矩阵问题 将正方形矩阵顺时针转动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