跳转至

核心代码

多数组实现链表

#include<iostream>
#include<vector>
using namespace std;
class List{
    public:
        vector<int> next;
        vector<int> key;
        vector<int> prev;
        int free=0;
        int head=-1;
        int len=0;

        List(int size){
            next=vector<int>(size);
            key=vector<int>(size);
            prev=vector<int>(size);
            for(int i=0;i<size;i++)next[i]=i+1;
            next[size-1]=-1;
        }
        int allocate(){
            if(free == -1)return -1;
            int obj = free;
            free = next[free];
            return obj;
        }
        void add(int index,int val){
            if(free==-1)return;
            len++;
            int obj=allocate();
            key[obj]=val;
            if(head==-1){
                head=obj;
                prev[obj]=-1;
                next[obj]=-1;
                return;
            }
            int p = head;
            while(index>0 && next[p]!=-1){p=next[p];index--;}
            if(index > 0){
                next[p]=obj;
                prev[obj]=p;
                next[obj]=-1;
            }else{
                if(p==head){
                    head=obj;
                    next[head]=p;
                    prev[p]=head;
                }else{
                    next[obj]=p;
                    prev[obj]=prev[p];
                    next[prev[obj]]=obj;
                    prev[p]=obj;
                }
            }
            return;
        }
        void update(int index,int val){
            int p = head;
            while(index>0){p=next[p];index--;}
            key[p] = val;
        }

        void remove(int index){
            len--;
            int p=head;
            while(index>0){p = next[p];index--;}
            if(p==head){
                if(next[p]!=-1)prev[next[p]]=-1;
                head = next[p];
            }else if(next[p]==-1){
                next[prev[p]]=-1;
            }else{
                next[prev[p]]=next[p];
                prev[next[p]]=prev[p];
            }
            free1(p);
        }
        void free1(int obj){
            next[obj]=free;
            free=obj;
        }

        int search(int index){
            int p=head;
            while(index > 0){p = next[p];index--;}
            return key[p];
        }
        void print1(){
            int p=head;
            while(p!=-1){
                cout<<key[p]<<" ";
                p=next[p];
            }
            cout<<endl;
        }

        void sort1(){
            int p=next[head];
            next[head]=-1;
            while(p!=-1){
                int tmp=next[p];
                int t=head;
                while(next[t] != -1 && key[t] < key[p])t=next[t];
                if(key[t]<key[p]){
                    next[t]=p;
                    prev[p]=t;
                    next[p]=-1;
                }else if(t == head){
                    next[p]=t;
                    prev[t]=p;
                    head=p;
                }else{
                    next[p] = t;
                    prev[p] = prev[t];
                    next[prev[p]] = p;
                    prev[t] = p;
                }
                p=tmp;
            }
        }
};
int n;
int main(){
    cin>>n;
    List list(n);
    int type,index,val;
    for(int i=0;i<n;i++){   
        cin>>type;
        if(type==0){
            cin>>index>>val;
            list.add(index,val);
        }
        else if(type==1){
            cin>>index;
            list.remove(index);
        }
        else if(type==2){
            cin>>index;
            cout<<list.search(index)<<" "<< endl;
        }
        else if(type==3){
            cin>>index>>val;
            list.update(index,val);
        }
        else if(type == 4)list.sort1();

        if(type!=2)list.print1();
    }
    return 0;
}

指针实现链表

#include<iostream>
using namespace std;
class Node{
    //双向链表的节点
    public:
        int data;
        Node * Next;Node * Prev;
};

class List{
    //双向链表本身
public:
    Node *Head;Node *Tail;
    int length;
    List(int length){
        //创建
        this->length=length;
        Head=new Node();
        Head->Prev=NULL;
        Tail=Head;

        for(int i=0;i<length;i++){
            Node *tmp=new Node();
            cin>>tmp->data;
            tmp->Next=NULL;
            tmp->Prev=Tail;
            Tail->Next=tmp;
            Tail=tmp;
        }

    }

    ~List(){ //析构函数,销毁时用
        Node *q;
        Node *p=Head->Next;
        while(p!=NULL){
            q=p;
            p=p->Next;
            delete q;
        }
        p=NULL;q=NULL;
    }

    void add(int val,int index){
        Node *p=Head->Next;
        if(index>length||index<=0)return;
        for(int i=0;i<index-1;i++)p=p->Next;
        Node * tmp=new Node();
        tmp->data=val;
        tmp->Next=p;
        tmp->Prev=p->Prev;
        p->Prev->Next=tmp;
        p->Prev=tmp;
        length++;
    }



    void update(int val,int index){
        //修改
        Node * p=Head->Next;
        if(index>length||index<=0)return;
        for(int i=0;i<index-1;i++)p=p->Next;
        p->data=val;
    }

    void remove(int index){
        //删除
        Node * p=Head->Next;
        if(index>length||index<=0)return;
        for(int i=0;i<index-1;i++)p=p->Next;
        p->Prev->Next=p->Next;
        p->Next->Prev=p->Prev;
        delete p;
        length--;
    }

    int search(int index){
        //查找
        Node * p=Head->Next;
        if(index>length||index<=0)return 0;
        for(int i=0;i<index-1;i++)p=p->Next;
        return p->data;
    }

    void sort1(){
        //插入排序
        if(Head->Next==NULL||Head->Next->Next==NULL)return;
        Node * p2=Head->Next->Next;
        Node * p1=Head;
        Head->Next->Next=NULL;
        while(p2){
            Node * p3=p2->Next;
            while(p1->Next){
                if(p2->data<p1->Next->data){
                    p2->Next=p1->Next;
                    p2->Prev=p1;
                    p1->Next->Prev=p2;
                    p1->Next=p2;
                    break;
                }
                p1=p1->Next;
            }
            if(p1->Next==NULL){
                p2->Next=NULL;
                p2->Prev=p1;
                p1->Next=p2;
            }
            p2=p3;
        }

        Node * pt=Head;
        while(pt->Next)pt=pt->Next;
        Tail=pt;
    }

    void print1(){
        Node * p=Head->Next;
        while(p!=NULL){
            cout<<p->data<<" ";
            p=p->Next;
        }
        cout<<endl;
    }

    /*
    void sort2(){
        //冒泡排序
        Node * p=new Node();
        Node * q=new Node();
        int tmp;
        for(p=Head->Next;p->Next!=NULL;p=p->Next)
        {
            for(q=p->Next;q!=NULL;q=q->Next)
            {
                if(q->data<p->data)
                {
                    tmp=q->data;
                    q->data=p->data;
                    p->data=tmp;
                }
            }
        }
    }
    */
};

int n;
int main(){
    cin>>n;
    List list(n);
    list.sort1();
    list.print1();
    return 0;
}

test1

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class MultiArrayObject {
private:
    vector<int> data;  // 存储元素的数组
    vector<int> next;  // 存储每个元素的下一个节点的索引
    int head;          // 链表头指针

public:
    MultiArrayObject() {
        head = -1;
    }

    // 在指定位置插入元素
    void insert(int index, int val) {
        if (index < 0 || index > data.size()) {
            return;
        }
        data.insert(data.begin() + index, val);
        next.insert(next.begin() + index, -1);
        if (index == 0) {
            next[index] = head;
            head = index;
        } else {
            next[index - 1] = index;
            next[index] = next[index - 1];
        }
    }

    // 删除指定位置的元素
    void remove(int index) {
        if (index < 0 || index >= data.size()) {
            return;
        }
        if (index == head) {
            head = next[index];
        } else {
            int curr = head;
            while (next[curr] != index) {
                curr = next[curr];
            }
            next[curr] = next[index];
        }
        data.erase(data.begin() + index);
        next.erase(next.begin() + index);
    }

    // 获取指定位置的元素
    int get(int index) {
        if (index < 0 || index >= data.size()) {
            return -1;
        }
        return data[index];
    }

    // 修改指定位置的元素
    void set(int index, int val) {
        if (index < 0 || index >= data.size()) {
            return;
        }
        data[index] = val;
    }

    // 对链表进行选择排序
    void selectionSort() {
        int i, j, min_idx;
        for (i = 0; i < data.size() - 1; i++) {
            min_idx = i;
            for (j = i + 1; j < data.size(); j++) {
                if (data[j] < data[min_idx]) {
                    min_idx = j;
                }
            }
            if (min_idx != i) {
                int temp = data[i];
                data[i] = data[min_idx];
                data[min_idx] = temp;

                int next_temp = next[i];
                next[i] = next[min_idx];
                next[min_idx] = next_temp;
            }
        }
    }
};

int main() {
    int N, op, pos, val;
    cin >> N;
    MultiArrayObject obj;
    for (int i = 0; i < N; i++) {
        cin >> op;
        switch (op) {
            case 0:  // 增加(插入)
                cin >> pos >> val;
                obj.insert(pos, val);
                for(int j=0;i<obj.data.size();i++)cout<<obj[j]<<" ";
                break;
            case 1:  // 删除
                cin >> pos;
                obj.remove(pos);
                for(int j=0;i<obj.data.size();i++)cout<<obj[j]<<" ";
                break;
            case 2:  // 查找
                cin >> pos;
                cout << obj.get(pos) << endl;
                for(int j=0;i<obj.data.size();i++)cout<<obj[j]<<" ";
                break;
            case 3:  // 修改
                cin >> pos >> val;
                obj.set(pos, val);
                for(int j=0;i<obj.data.size();i++)cout<<obj[j]<<" ";
                break;
            case 4:  // 排序
                obj.selectionSort();
                for(int j=0;i<obj.data.size();i++)cout<<obj[j]<<" ";
                break;

        }
    }
}

test2.py

class MultiArrayObject:
    def __init__(self):
        self.data = []  # 存储元素的数组
        self.next = []  # 存储每个元素的下一个节点的索引
        self.head = -1  # 链表头指针

    # 在指定位置插入元素
    def insert(self, index, val):
        if index < 0 or index > len(self.data):
            return
        self.data.insert(index, val)
        self.next.insert(index, -1)
        if index == 0:
            self.next[index] = self.head
            self.head = index
        else:
            self.next[index - 1] = index
            self.next[index] = self.next[index - 1]

    # 删除指定位置的元素
    def remove(self, index):
        if index < 0 or index >= len(self.data):
            return
        if index == self.head:
            self.head = self.next[index]
        else:
            curr = self.head
            while self.next[curr] != index:
                curr = self.next[curr]
            self.next[curr] = self.next[index]
        self.data.pop(index)
        self.next.pop(index)

    # 获取指定位置的元素
    def get(self, index):
        if index < 0 or index >= len(self.data):
            return -1
        return self.data[index]

    # 修改指定位置的元素
    def set(self, index, val):
        if index < 0 or index >= len(self.data):
            return
        self.data[index] = val

    # 对链表进行选择排序
    def selection_sort(self):
        for i in range(len(self.data) - 1):
            min_idx = i
            for j in range(i + 1, len(self.data)):
                if self.data[j] < self.data[min_idx]:
                    min_idx = j
            if min_idx != i:
                self.data[i], self.data[min_idx] = self.data[min_idx], self.data[i]
                self.next[i], self.next[min_idx] = self.next[min_idx], self.next[i]

# 主程序
N = int(input())
obj = MultiArrayObject()
for i in range(N):
    op = list(map(int, input().split()))
    if op[0] == 0:
        pos, val = op[1], op[2]
        obj.insert(pos, val)
        for j in range(len(obj.data)):
            print(obj.data[j],end=" ")
    elif op[0] == 1:
        pos = op[1]
        obj.remove(pos)
        for j in range(len(obj.data)):
            print(obj.data[j],end=" ")
    elif op[0] == 2:
        pos = op[1]
        print(obj.get(pos))
        for j in range(len(obj.data)):
            print(obj.data[j],end=" ")
    elif op[0] == 3:
        pos, val = op[1], op[2]
        obj.set(pos, val)
        for j in range(len(obj.data)):
            print(obj.data[j],end=" ")
    elif op[0] == 4:
        obj.selection_sort()
        for j in range(len(obj.data)):
            print(obj.data[j],end=" ")

test3

#include<iostream>
#include<vector>

using namespace std;

class List{
public:
    vector<int> next;
    vector<int> key;
    vector<int> pre;
    int free = 0;
    int head = -1;
    int length = 0;

    List(int size){
        next = vector<int>(size);
        key = vector<int>(size);
        pre = vector<int>(size);
        for(int i=0;i<size-1;i++)
            next[i] = i + 1;
        next[size - 1] = -1;
    }

    bool add(int index,int val){
        if(free == -1)
            return false;
        length++;
        int obj = allocate_object();
        key[obj] = val;
        if(head == -1){
            head = obj;
            pre[obj] = -1;
            next[obj] = -1;
            return true;
        }
        int p = head;
        while(index > 0 && next[p] != -1){
            p = next[p];
            index--;
        }
        if(index > 0){
            next[p] = obj;
            pre[obj] = p;
            next[obj] = -1;
        }
        else{
            if(p == head){
                head = obj;
                next[head] = p;
                pre[p] = head;
            }
            else{
                next[obj] = p;
                pre[obj] = pre[p];
                next[pre[obj]] = obj;
                pre[p] = obj;
            }
        }
        return true;
    }

    void update(int index,int val){
        int p = head;
        while(index > 0){
            p = next[p];
            index--;
        }
        key[p] = val;
    }

    void remove(int index){
        length--;
        int p = head;
        while(index > 0){
            index--;
            p = next[p];
        }
        if(p == head){
            if(next[p] != -1)
                pre[next[p]] = -1;
            head = next[p];
        }
        else if(next[p] == -1){
            next[pre[p]] = -1;
        }
        else{
            next[pre[p]] = next[p];
            pre[next[p]] = pre[p];
        }
        free_obj(p);
    }

    int search(int index){
        int p = head;
        while(index > 0){
            p = next[p];
            index--;
        }
        return key[p];
    }

    void println(){
        int p = head;
        while(p != -1){
            cout << key[p] << ' ';
            p = next[p];
        }
        cout << endl;
    }

    void sortList(){
        int p = next[head];
        next[head] = -1;
        while(p != -1){
            int s = next[p];
            int t = head;
            while(next[t] != -1 && key[t] < key[p])
                t = next[t];
            if(key[t] < key[p]){
                next[t] = p;
                pre[p] = t;
                next[p] = -1;
            }
            else if(t == head){
                head = p;
                next[p] = t;
                pre[t] = p;
            }
            else{
                next[p] = t;
                pre[p] = pre[t];
                next[pre[p]] = p;
                pre[t] = p;
            }
            p = s;
        }
    }

private:
    int allocate_object(){
        if(free == -1)
            return -1;
        int obj = free;
        free = next[free];
        return obj;
    }

    int free_obj(int obj){
        next[obj] = free;
        free = obj;
    }
};

int main(){
    int n;
    cin >> n;
    List list(n);
    int type,index,val;
    for(int i=0;i<n;i++){
        cin >> type;
        if(type == 0){
            cin >> index;
            cin >> val;
            list.add(index,val);
        }
        else if(type == 1){
            cin >> index;
            list.remove(index);
        }
        else if(type == 2){
            cin >> index;
            cout << list.search(index) << endl;
        }
        else if(type == 3){
            cin >> index;
            cin >> val;
            list.update(index,val);
        }
        else
            list.sortList();
        if(type != 2)list.println();
    }
    return 0;
}

test4

#include<iostream>
#include<vector>
#include <fstream>
using namespace std;
ofstream fout("test10.out");
class List{
public:
    vector<int> next;
    vector<int> key;
    vector<int> pre;
    int free = 0;
    int head = -1;
    int length = 0;

    List(int size){
        next = vector<int>(size);
        key = vector<int>(size);
        pre = vector<int>(size);
        for(int i=0;i<size-1;i++)next[i] = i + 1;
        next[size - 1] = -1;
    }

    bool add(int index,int val){
        if(free == -1)return false;
        length++;
        int obj = allocate_object();
        key[obj] = val;
        if(head == -1){
            head = obj;
            pre[obj] = -1;
            next[obj] = -1;
            return true;
        }
        int p = head;
        while(index > 0 && next[p] != -1){
            p = next[p];
            index--;
        }
        if(index > 0){
            next[p] = obj;
            pre[obj] = p;
            next[obj] = -1;
        }
        else{
            if(p == head){
                head = obj;
                next[head] = p;
                pre[p] = head;
            }
            else{
                next[obj] = p;
                pre[obj] = pre[p];
                next[pre[obj]] = obj;
                pre[p] = obj;
            }
        }
        return true;
    }

    void update(int index,int val){
        int p = head;
        while(index > 0){
            p = next[p];
            index--;
        }
        key[p] = val;
    }

    void remove(int index){
        length--;
        int p = head;
        while(index > 0){
            index--;
            p = next[p];
        }
        if(p == head){
            if(next[p] != -1)
                pre[next[p]] = -1;
            head = next[p];
        }
        else if(next[p] == -1){
            next[pre[p]] = -1;
        }
        else{
            next[pre[p]] = next[p];
            pre[next[p]] = pre[p];
        }
        free_obj(p);
    }

    int search(int index){
        int p = head;
        while(index > 0){
            p = next[p];
            index--;
        }
        return key[p];
    }

    void println(){
        int p = head;
        while(p != -1){
            fout << key[p] << ' ';
            p = next[p];
        }
        fout << endl;
    }

    void sortList(){
        int p = next[head];
        next[head] = -1;
        while(p != -1){
            int s = next[p];
            int t = head;
            while(next[t] != -1 && key[t] < key[p])
                t = next[t];
            if(key[t] < key[p]){
                next[t] = p;
                pre[p] = t;
                next[p] = -1;
            }
            else if(t == head){
                head = p;
                next[p] = t;
                pre[t] = p;
            }
            else{
                next[p] = t;
                pre[p] = pre[t];
                next[pre[p]] = p;
                pre[t] = p;
            }
            p = s;
        }
    }

    int allocate_object(){
        if(free == -1)return -1;
        int obj = free;
        free = next[free];
        return obj;
    }

    void free_obj(int obj){
        next[obj] = free;
        free = obj;
    }
};

int main(){
    ifstream fin("10.in");

    int n;
    fin >> n;
    List list(n);
    int type,index,val;
    for(int i=0;i<n;i++){   
        fin >> type;
        if(type == 0){
            fin >> index;
            fin >> val;
            list.add(index,val);
        }
        else if(type == 1){
            fin >> index;
            list.remove(index);
        }
        else if(type == 2){
            fin >> index;
            fout << list.search(index) <<" "<< endl;
        }
        else if(type == 3){
            fin >> index;
            fin >> val;
            list.update(index,val);
        }
        else if(type == 4){
            list.sortList();
        }

        if(type != 2)list.println();
    }
    fin.close();
    fout.close();
    return 0;
}

test5


#include<iostream>

#define NOEXIST 0x7fffffff
using namespace std;
template <typename T> class list;
template <typename T> ostream& operator<<(ostream&, const list<T> &);

template <typename T>
class list{
private:
    size_t *next;
    T *key;
    size_t *prev;
    size_t free;//管理自由节点链表,单链表即可
    size_t head;//管理已用结点链表,双链表
    size_t list_size;//链表总大小,包括自由链表
    friend ostream& operator<< <T>(ostream&, const list &);
    size_t getFree();//获得自由节点
    void addFree(size_t index)
    {//添加空闲空间到自由链表
        next[index] = free;
        free = index;
    }
    void newList(size_t n)
    {//分配空间
        key = new T[n];
        next = new size_t[n];
        prev = new size_t[n];
    }
    void deleteList(size_t *p, T *k, size_t *n)
    {//收回空间
        delete[] p;
        delete[] k;
        delete[] n;
    }
    void copyList(size_t *p, T *k, size_t *n, size_t s)
    {//复制链表
        copy(p, p + s, prev);
        copy(n, n + s, next);
        copy(k, k + s, key);
    }
    void setFree(size_t start_index)
    {//设置自由链表
        next[list_size - 1] = NOEXIST;
        for (size_t i = start_index; i != list_size - 1; ++i)
            next[i] = i + 1;
        free = start_index;
    }
public:
    list() :free(NOEXIST), head(NOEXIST), list_size(8)//-1表示空,最初链表有8个空间
    {//初始化,设置free链表
        newList(list_size);
        setFree(0);
    }
    list(T *beg, T *end) :list() { insert(beg, end); }
    void setData(size_t index, const T &t) { key[index] = t; }
    T getData(size_t index)const { return key[index]; }
    void insert(const T&);
    void insert(T*, T*);
    size_t locate(const T&);
    void erase(const T&);
    void erase(size_t);
    void edit(const T&, const T&);
    bool empty() { return head == NOEXIST; }//链表是否为空
    ~list()
    {
        deleteList(prev, key, next);
    }
    //bool full() { return free == -1; }
};

template <typename T>
inline size_t list<T>::getFree()
{
    if (free == NOEXIST)
    {//若自由链表已空,则需补充空间
        size_t *old_next = next, *old_prev = prev;
        T *old_key = key;
        size_t old_list_size = list_size;
        list_size *= 2;
        newList(list_size);
        copyList(old_prev, old_key, old_next, old_list_size);
        deleteList(old_prev,old_key,old_next);
        setFree(old_list_size);
    }
    size_t index = free;
    free = next[index];
    return index;
}

template <typename T>
void list<T>::insert(const T &t)
{
    size_t index = getFree();
    key[index] = t;
    if (head == NOEXIST)
    {//插入的是第一个节点
        next[index] = NOEXIST;
        prev[index] = NOEXIST;
        head = index;
    }
    else
    {//否则
        next[index] = head;
        prev[head] = index;
        prev[index] = NOEXIST;
        head = index;
    }
}

template <typename T>
void list<T>::insert(T *beg, T *end)
{
    for (; beg != end; ++beg)
        insert(*beg);
}

template <typename T>
size_t list<T>::locate(const T &t)
{
    size_t p = head;
    while (p != NOEXIST && key[p] != t)
        p = next[p];
    return p;
}

template <typename T>
void list<T>::erase(size_t index)
{
    if (index == head)//删除的是头结点
        head = next[index];
    else
    {
        next[prev[index]] = next[index];
        if (next[index] != NOEXIST)//若删除的不是最后一个节点
            prev[next[index]] = prev[index];
    }
    addFree(index);
}
template <typename T>
void list<T>::erase(const T &t)
{
    size_t index = locate(t);
    if (index != NOEXIST)
        erase(index);
}


template <typename T>
void list<T>::edit(const T &old_key, const T &new_key)
{
    size_t index = locate(old_key);
    if (index == NOEXIST)
    {
        cout << old_key << " isn't exist!" << endl;
        return;
    }
    key[index] = new_key;
}

template <typename T>
ostream& operator<<(ostream &out, const list<T> &lst)
{
    size_t p = lst.head;
    while (p != NOEXIST)
    {
        out << lst.key[p];
        if (lst.next[p] != NOEXIST) out << ' ';
        p = lst.next[p];
    }
    return out;
}

int main(){
    int a[] = { 1, 2, 3, 4, 5, 6 };
    list<int> lst(a,a + 6);
    cout << lst << endl << endl;
    for (int i = 10; i != 20; ++i)
        lst.insert(i);
    cout << lst << endl << endl;
    for (int i = 1; i != 1000; ++i)
    {
        size_t f = lst.locate(i);
        if (f != NOEXIST)
            lst.insert(-i);
    }
    cout << lst << endl;
    getchar();
    return 0;
}

others

#include<iostream>
using namespace std;
class Node{
    //双向链表的节点
    public:
        int data;
        Node * Next;Node * Prev;
};

class List{
    //双向链表本身
public:
    Node *Head;Node *Tail;
    int length;
    List(int length){
        //创建
        this->length=length;
        Head=new Node();
        Head->Prev=NULL;
        Tail=Head;

        for(int i=0;i<length;i++){
            Node *tmp=new Node();
            cin>>tmp->data;
            tmp->Next=NULL;
            tmp->Prev=Tail;
            Tail->Next=tmp;
            Tail=tmp;
        }

    }

    ~List(){ //析构函数,销毁时用
        Node *q;
        Node *p=Head->Next;
        while(p!=NULL){
            q=p;
            p=p->Next;
            delete q;
        }
        p=NULL;q=NULL;
    }

    void add(int val,int index){
        Node *p=Head->Next;
        if(index>length||index<=0)return;
        for(int i=0;i<index-1;i++)p=p->Next;
        Node * tmp=new Node();
        tmp->data=val;
        tmp->Next=p;
        tmp->Prev=p->Prev;
        p->Prev->Next=tmp;
        p->Prev=tmp;
        length++;
    }



    void update(int val,int index){
        //修改
        Node * p=Head->Next;
        if(index>length||index<=0)return;
        for(int i=0;i<index-1;i++)p=p->Next;
        p->data=val;
    }

    void remove(int index){
        //删除
        Node * p=Head->Next;
        if(index>length||index<=0)return;
        for(int i=0;i<index-1;i++)p=p->Next;
        p->Prev->Next=p->Next;
        p->Next->Prev=p->Prev;
        delete p;
        length--;
    }

    int search(int index){
        //查找
        Node * p=Head->Next;
        if(index>length||index<=0)return 0;
        for(int i=0;i<index-1;i++)p=p->Next;
        return p->data;
    }

    void sort1(){
        //插入排序
        if(Head->Next==NULL||Head->Next->Next==NULL)return;
        Node * p2=Head->Next->Next;
        Node * p1=Head;
        Head->Next->Next=NULL;
        while(p2){
            Node * p3=p2->Next;
            while(p1->Next){
                if(p2->data<p1->Next->data){
                    p2->Next=p1->Next;
                    p2->Prev=p1;
                    p1->Next->Prev=p2;
                    p1->Next=p2;
                    break;
                }
                p1=p1->Next;
            }
            if(p1->Next==NULL){
                p2->Next=NULL;
                p2->Prev=p1;
                p1->Next=p2;
            }
            p2=p3;
        }

        Node * pt=Head;
        while(pt->Next)pt=pt->Next;
        Tail=pt;
    }

    void print1(){
        Node * p=Head->Next;
        while(p!=NULL){
            cout<<p->data<<" ";
            p=p->Next;
        }
        cout<<endl;
    }

    /*
    void sort2(){
        //冒泡排序
        Node * p=new Node();
        Node * q=new Node();
        int tmp;
        for(p=Head->Next;p->Next!=NULL;p=p->Next)
        {
            for(q=p->Next;q!=NULL;q=q->Next)
            {
                if(q->data<p->data)
                {
                    tmp=q->data;
                    q->data=p->data;
                    p->data=tmp;
                }
            }
        }
    }
    */
};

int n;
int main(){
    cin>>n;
    List list(n);
    list.sort1();
    list.print1();
    return 0;
}
#include<iostream>
#include<vector>

using namespace std;

class List{
public:
    List(int size){
        next = vector<int>(size);
        key = vector<int>(size);
        pre = vector<int>(size);
        for(int i=0;i<size-1;i++)
            next[i] = i + 1;
        next[size - 1] = -1;
    }

    bool add(int index,int val){
        if(free == -1)
            return false;
        length++;
        int obj = allocate_object();
        key[obj] = val;
        if(head == -1){
            head = obj;
            pre[obj] = -1;
            next[obj] = -1;
            return true;
        }
        int p = head;
        while(index > 0 && next[p] != -1){
            p = next[p];
            index--;
        }
        if(index > 0){
            next[p] = obj;
            pre[obj] = p;
            next[obj] = -1;
        }
        else{
            if(p == head){
                head = obj;
                next[head] = p;
                pre[p] = head;
            }
            else{
                next[obj] = p;
                pre[obj] = pre[p];
                next[pre[obj]] = obj;
                pre[p] = obj;
            }
        }
        return true;
    }

    void update(int index,int val){
        int p = head;
        while(index > 0){
            p = next[p];
            index--;
        }
        key[p] = val;
    }

    void remove(int index){
        int p = head;
        while(index > 0){
            index--;
            p = next[p];
        }
        if(p == head){
            if(next[p] != -1)
                pre[next[p]] = -1;
            head = next[p];
        }
        else if(next[p] == -1){
            next[pre[p]] = -1;
        }
        else{
            next[pre[p]] = next[p];
            pre[next[p]] = pre[p];
        }
        free_obj(p);
        length--;
    }

    int search(int index){
        int p = head;
        while(index > 0){
            p = next[p];
            index--;
        }
        return key[p];
    }

    void println(){
        int p = head;
        while(p != -1){
            std::cout << key[p] << ' ';
            p = next[p];
        }
        cout << endl;
    }

    void sortList(){
        int p = next[head];
        next[head] = -1;
        while(p != -1){
            int s = next[p];
            int t = head;
            while(next[t] != -1 && key[t] < key[p])
                t = next[t];
            if(key[t] < key[p]){
                next[t] = p;
                pre[p] = t;
                next[p] = -1;
            }
            else if(t == head){
                head = p;
                next[p] = t;
                pre[t] = p;
            }
            else{
                next[p] = t;
                pre[p] = pre[t];
                next[pre[p]] = p;
                pre[t] = p;
            }
            p = s;
        }
    }

    int getLength(){
        return length;
    }

private:
    vector<int> next;
    vector<int> key;
    vector<int> pre;
    int free = 0;
    int head = -1;
    int length = 0;

    int allocate_object(){
        if(free == -1)
            return -1;
        int obj = free;
        free = next[free];
        return obj;
    }

    int free_obj(int obj){
        next[obj] = free;
        free = obj;
    }
};

class LinkedList {
public:
    struct Node{
        int val;
        Node * next;
        Node(int val ):val(val), next(nullptr){};
        Node(int val , Node* next):val(val), next(next){}
    };

    LinkedList() {
        //虚拟节点方便计算
        _dummyHead = new Node(0); 
        _maxindex = -1;
    }

    int get(int index) {

        if(index < 0 || index >_maxindex)
            return -1;
        Node * cur = _dummyHead;
        for(int i = 0; i <= index; i++){
            cur = cur->next;
        }
        return cur->val;
    }

    void printList(){
        auto p = _dummyHead->next;
        while(p){
            cout << p->val << ' ';
            p = p->next;
        }
        cout << endl;
    }

    void addAtHead(int val) {
        Node * newNode = new Node(val, _dummyHead->next);
        _dummyHead->next = newNode;
        _maxindex++;
    }

    void addAtTail(int val) {
        Node * cur = _dummyHead;
        while(cur->next != nullptr){
            cur = cur->next;
        }
        Node * newNode = new Node(val);
        cur->next = newNode;
        _maxindex++;
    }

    void addAtIndex(int index, int val) {
        if(index == _maxindex +1 )
            addAtTail(val);
        else if(index > _maxindex+1)
            return ;
        else{
            Node * cur = _dummyHead;
            for(int i = 0 ; i < index; i++){
                cur = cur->next;
            }
            Node * newNode = new Node(val);
            newNode->next = cur->next;
            cur->next = newNode;
            _maxindex++;
        }

    }

    void deleteAtIndex(int index) {
        if(index < 0 || index > _maxindex)
            return ;
        Node * cur = _dummyHead;
        for(int i = 0 ; i < index; i++){
            cur = cur->next;
        }
        Node * p = cur->next;
        cur->next = p->next;
        delete p;
        _maxindex--;
    }

    void sortList()
    {
        Node* head = _dummyHead->next;
        if (head == NULL || head->next == NULL)
        {
            return;
        }
        Node* left = head;//记录已排序序列的最后一个节点
        Node* cur = head->next;//记录待排序列的第一个节点
        Node* pre = NULL;
        while (cur)
        {
            if (cur->val >= left->val)
            {
                left = left->next;
            }
            else
            {
                pre = _dummyHead;
                while (pre->next->val < cur->val)
                {
                    pre = pre->next;
                }
                left->next = cur->next;
                cur->next = pre->next;
                pre->next = cur;
            }
            cur = left->next;
        }
    }

    int getLength(){
        return _maxindex + 1;
    }

private:
    int _maxindex;
    Node * _dummyHead;
};

vector<int> create(int N,int low,int high){
    vector<int> arr(N);
    for(int i=0;i<N;i++)
        arr[i] = rand() % (high - low + 1) + low;
    return arr;
}

int main(){
    int N = 100000;
    int low = 0,high = 100000;
    vector<int> arr = create(N,low,high);
    List list1(N);
    LinkedList list2;
    long time1,time2;
    /*time1 = clock();
    for(int i=0;i<arr.size();i++)
        list1.add(0,arr[i]);
    time2 = clock();
    cout << "多重数组链表使用头插法建立链表用时:\t" << ((double)time2 - time1) / CLOCKS_PER_SEC << endl;
    time1 = clock();
    for(int i=0;i<arr.size();i++)
        list2.addAtHead(arr[i]);
    time2 = clock();
    cout << "指针链表使用头插法建立链表用时:\t" << ((double)time2 - time1) / CLOCKS_PER_SEC << endl;
    cout << "------------------------------------------------" << endl;
    time1 = clock();
    for(int i=0;i<arr.size();i++){
        list1.add(list1.getLength(),arr[i]);
    }
    time2 = clock();
    cout << "多重数组链表使用尾插法建立链表用时:\t" << ((double)time2 - time1) / CLOCKS_PER_SEC << endl;
    time1 = clock();
    for(int i=0;i<arr.size();i++){
        list2.addAtTail(arr[i]);
    }
    time2 = clock();
    cout << "指针链表使用尾插法建立链表用时:\t" << ((double)time2 - time1) / CLOCKS_PER_SEC << endl;


    cout << "-------------------------------------------------" << endl;
    for(int i=0;i<arr.size();i++)
        list1.add(0,arr[i]);

    for(int i=0;i<arr.size();i++)
        list2.addAtHead(arr[i]);

    time1 = clock();
    for(int i=0;i<arr.size();i++){
        list1.remove(0);
    }
    time2 = clock();
    cout << "多重数组链表删除链表用时:\t" << ((double)time2 - time1) / CLOCKS_PER_SEC << endl;
    time1 = clock();
    for(int i=0;i<arr.size();i++){
        list2.deleteAtIndex(0);
    }
    time2 = clock();
    cout << "指针链表删除链表用时:\t" << ((double)time2 - time1) / CLOCKS_PER_SEC << endl;*/


    std::cout << "-------------------------------------------------" << endl;

    for(int i=0;i<arr.size();i++)
        list1.add(0,arr[i]);

    for(int i=0;i<arr.size();i++)
        list2.addAtHead(arr[i]);

    time1 = clock();
    list1.sortList();
    time2 = clock();
    std::cout << "多重数组链表排序用时:\t" << ((double)time2 - time1) / CLOCKS_PER_SEC << endl;
    time1 = clock();
    list2.sortList();
    time2 = clock();
    std::cout << "指针链表排序用时:\t" << ((double)time2 - time1) / CLOCKS_PER_SEC << endl;

}