손으로 쓴 코드 : 단일 연결 목록 삽입

연결 목록의 두 번째 노드에서 순회를 시작합니다. 현재 노드의 왼쪽에있는 모든 노드는 순서가 있어야합니다. 먼저 현재 노드와 왼쪽 인접 노드를 비교합니다. 왼쪽 인접 노드가 현재 노드보다 작거나 같으면 다음 노드로 바로 이동합니다. 왼쪽 인접 노드가 현재 노드보다 크면 첫 번째 노드부터 탐색을 시작합니다. 연결 목록의 순서가 지정된 부분에 노드를 추가하고 현재 노드가 그보다 작은 지 확인한 다음 시퀀스 부분에 노드를 삽입합니다.

코드는 golang으로 작성되었으며 코드는 다음과 같습니다.

package main

import "fmt"

func main() {
    //head := &ListNode{Val: 4}
    //head.Next = &ListNode{Val: 2}
    //head.Next.Next = &ListNode{Val: 1}
    //head.Next.Next.Next = &ListNode{Val: 3}

    head := &ListNode{Val: -1}
    head.Next = &ListNode{Val: 5}
    head.Next.Next = &ListNode{Val: 3}
    head.Next.Next.Next = &ListNode{Val: 4}
    head.Next.Next.Next.Next = &ListNode{Val: 0}

    printlnLinkNodeList(head)

    head = InsertSort(head)

    printlnLinkNodeList(head)
}

//Definition for singly-linked list.
type ListNode struct {
    Val  int
    Next *ListNode
}

//链表打印
func printlnLinkNodeList(head *ListNode) {
    cur := head
    for cur != nil {
        fmt.Print(cur.Val, "\t")
        cur = cur.Next
    }
    fmt.Println()
}

//插入排序
func InsertSort(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    preAns := &ListNode{Next: head}

    pre := head
    cur := head.Next
    for cur != nil {
        if pre.Val <= cur.Val {
            //不管

            //下一个循环的准备工作
            pre, cur = cur, cur.Next
        } else {
            preTemp := preAns
            temp := preAns.Next
            for cur.Val >= temp.Val {
                preTemp, temp = temp, temp.Next
            }

            //删除当前节点
            pre.Next = cur.Next

            //有序节点里插入当前节点
            preTemp.Next, cur.Next = cur, temp

            //下一个循环的准备工作,pre不变
            cur = pre.Next
        }

    }
    return preAns.Next
}

실행 결과는 다음과 같습니다.
여기에 사진 설명 삽입

 

추천

출처blog.csdn.net/wangxi06/article/details/114967570