📌  相关文章
📜  用于单链表递归选择排序的 Javascript 程序 - 交换节点链接(1)

📅  最后修改于: 2023-12-03 14:56:19.730000             🧑  作者: Mango

用于单链表递归选择排序的 Javascript 程序 - 交换节点链接

本程序用于对单链表进行递归选择排序。采用的数据结构是以 JavaScript 对象形式表示的单链表。

程序的实现方法是通过将节点的链接进行交换,实现对节点位置的变换。

代码实现

下面是使用 JavaScript 编写的单链表递归选择排序的程序:

/**
 * 节点类
 */
class Node {
    constructor(value) {
        this.value = value;
        this.next = null;
    }
}

/**
 * 链表类
 */
class LinkedList {
    constructor() {
        this.head = null;
    }

    /**
     * 插入节点
     * @param {*} value 
     */
    insert(value) {
        let node = new Node(value);
        if (this.head === null) {
            this.head = node;
        } else {
            let current = this.head;
            while (current.next !== null) {
                current = current.next;
            }
            current.next = node;
        }
    }

    /**
     * 单链表递归选择排序
     * @param {*} head 
     * @returns 
     */
    recursiveSelectionSort(head) {
        if (head === null || head.next === null) {
            return head;
        }

        let min = head;
        let beforeMin = null;
        let current = head;

        while (current.next !== null) {
            if (current.next.value < min.value) {
                min = current.next;
                beforeMin = current;
            }
            current = current.next;
        }

        if (min !== head) {
            beforeMin.next = head;
            let temp = head.next;
            head.next = min.next;
            min.next = temp;
            head = min;
        }

        head.next = this.recursiveSelectionSort(head.next);
        return head;
    }

    /**
     * 打印链表
     */
    printList() {
        let output = "";
        let current = this.head;
        while (current !== null) {
            output += current.value + " -> ";
            current = current.next;
        }
        output += "null";
        console.log(output);
    }
}

/**
 * 测试程序
 */
let linkedList = new LinkedList();
linkedList.insert(64);
linkedList.insert(25);
linkedList.insert(12);
linkedList.insert(22);
linkedList.insert(11);
linkedList.insert(35);

console.log("排序前:");
linkedList.printList();

linkedList.head = linkedList.recursiveSelectionSort(linkedList.head);

console.log("排序后:");
linkedList.printList();
代码说明

上述程序中,首先定义了两个类,即NodeLinkedList。其中Node表示链表中的节点,LinkedList表示单链表。

LinkedList中实现了三个方法,分别是insertrecursiveSelectionSortprintList。其中,insert方法是用于插入节点的,printList方法是用于打印链表的。

最重要的是recursiveSelectionSort方法,这是递归选择排序的核心实现。该方法在排序过程中,采用前面说的“交换节点链接”的方法。其中,先通过while循环找到单链表中最小的节点,然后将该节点移到链表的头部。如果需要移动,则通过对链表头部节点的链接进行交换,实现节点位置的变换。

最后通过测试程序,对单链表进行递归选择排序,并输出排序前和排序后的链表信息。