已知待排序初始序列用单链表存储,头指针head指向第一个结点,从这个待排序列中找出最小结点,插入head之后,用r来指示。r以前为已排序序列,r以后为未排序序列。再从未排序序列中找出最小结点,反复操作

问题描述

已知待排序初始序列用单链表存储,头指针head指向第一个结点,从这个待排序列中找出最小结点,插入head之后,用r来指示。r以前为已排序序列,r以后为未排序序列。再从未排序序列中找出最小结点插入r的后面,让r指向这个结点。反复执行这个过程,直到排好序。

输入

链表结点的个数,结点的数据

输出

排序过程以及最终结果

存储结构

链表

源代码

import java.util.Scanner;

public class LNode {
    int data;
    LNode next;
    public LNode() {
    }
    public LNode(int data) {
        this.data = data;
    }
}
class LinkedTable{
    LNode head;
    int length;
    //将数组转化为链表
    public LinkedTable(int[] array){
        head = new LNode(array[0]);
        LNode pre = head;
        for (int i = 1; i < array.length;i++){
            LNode lNode = new LNode(array[i]);
            pre.next = lNode;
            pre = lNode;
        }
        this.length = array.length;
    }
    //打印链表
    static void print(LNode head){
        while (head!=null){
            System.out.print(head.data);
            if (head.next!=null){
                System.out.print("——>");
            }
            head = head.next;
        }
    }
    LNode directSelectSort(){
        int count = this.length;
        LNode r = new LNode();
        r.next = head;
        head = r;  //head此时为空结点,head.next指向链表的第一个结点
        LNode pre;  //用来遍历
        LNode min;
        while (count-- > 1){
            pre = r.next; //每次从r的下一个开始遍历
            min = r.next;
            while (pre.next != null){
                pre = pre.next;
                if (pre.data < min.data){
                    min = pre;
                }
            }
            LNode Q = r;  //Q为辅助变量,用来删除min结点
            while (Q.next != min){
                Q = Q.next;
            }
            Q.next = min.next;  //删除完毕
            min.next = r.next;
            r.next = min;
            r = r.next;
            print(head.next);
            System.out.println();
        }
        return head.next;
    }
}
class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("输入链表结点的个数\t");
        int input = sc.nextInt();
        int[] arr = new int[input];
        System.out.println("依次输入每个结点的数据");
        for (int i = 0;i < input;i++){
            arr[i] = sc.nextInt();
        }
        LinkedTable linkedTable = new LinkedTable(arr);
        LinkedTable.print(linkedTable.head);
        System.out.println("\n排序:");
        LNode now = linkedTable.directSelectSort();
        System.out.println("排序完成后的链表为");
        LinkedTable.print(now);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
点的链表是一种常见的链表数据构,它在链表部额外增加了一个点,点不存储数据,仅用来标识链表部位置。 有了点,可以简化链表操作和处理过程。当我们要对链表进行遍历、查插入、删除等操作时,可以直接利用点的指针进行操作,而不需要对链表为空的情况进行特殊处理。 假设head指向一个带点的链表指针,我们可以通过head来实现对链表的各种操作。比如遍历链表可以通过以下步骤进行: 1. 定义一个指针curr,初始化为点的下一个点:curr = head->next。 2. 使用循环来遍历链表,当curr不为空时,执行以下操作: a. 访问当前点的数据:print(curr->data)。 b. 将指针curr指向下一个点:curr = curr->next。 3. 循环束后,遍历完成。 除了遍历,通过head还可以进行其他操作。比如查一个特定的数据元素可以通过以下步骤进行: 1. 定义一个指针curr,初始化为点的下一个点:curr = head->next。 2. 使用循环来遍历链表,当curr不为空时,执行以下操作: a. 判断当前点是否为所要查的数据元素,如果是则返回该点的位置。 b. 将指针curr指向下一个点:curr = curr->next。 3. 循环束后,如果没有到目标元素,返回不存在的标志。 总之,通过head指针,我们可以方便地对带点的链表进行各种操作,包括遍历、查插入、删除等,大大简化了链表的处理过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值