データ構造とアルゴリズム--------リスト

単一のリスト

リンクされたリストノード

typedef struct Node{
    int data;       //数据域
    Node* next;     //指针域,指向下一个结点
};

印刷一覧

ノート:

  1. データは、リストの先頭に格納されていません。
  2. NULLにリストポイントの最後の要素の次。
void PrintLinkList(Node* head){
    Node* cur = head->next;
    while(cur != NULL){
        cout<<cur->data<<"  ";
        cur = cur->next;
    }
    cout<<endl;     
}

リストの補間ヘッド

ノート:

  1. リストの先頭には、リストの末尾になり、リストの末尾にはNULLポイントであるため、ヌルにリストの頭の上に置きます。
  2. 最初のリスト生成された補間方法頭部>データは、new_head、例えばnew_head->頭を生成することが可能である、データです。ヘッドノードデータフィールドのデータと恥ずかしいしないことはそう。
Node* HeadInsert(Node* head,int arr[],int arrSize){
    head = NULL;                    //Notes:1
    for(int i = 0;i < arrSize;i++){
        Node* new_node = new Node;
        new_node->data = arr[i];
        new_node->next = head;      //Notes:1
        head = new_node;
    }
    Node* new_head = new Node;      //Notes:2
    new_head->next = head;
    return new_head;
}

リストテール補間

ノート:

  1. 位置が記録チームのテールポインタ後端のチームを必要とし、新たな要素が追加されるたびに、リア更新する必要があります。

  2. 各new_node->次のポイントはNULLにします。

Node* RearInsert(Node head,int arr[],int arrSize){
    Node* rear = head;
    for(int i = 0;i < arrSize;i++){
        Node* new_node = new Node;
        new_node->data = arr[i];
        new_node->next = NULL;
        rear->next = new_node;
        rear = rear->next;
    }
    return head;
}

逆の順番(非再帰的)で一覧

ノート:

  1. 素子の第1の逆方向リストが決定される前に、ノーオペレーション(ヘッド== NULL又は頭部>次== NULL)は、それを直接返しません。
  2. ちょうど発生P1、P2、P3の後に、P1は逆後エンドノードになり、それが必要であるP1->次に= NULL。
  3. P1、P2、P3がヘッドである後に第一、第二、第三のノード、リスト全体の後、完全にヘッドノードがデータを持つことができない逆、そのように統一され、頭部>次= P2が必要です。
Node* ReverseLinkList(Node* head){
    if(head == NULL || head->next == NULL){
        return head;
    }
    Node* p1 = head->next;
    Node* p2 = p1->next;
    Node* p3 = p2->next;
    p1->next = NULL;        //头变尾
    while(p3 != NULL){
        p2->next - p1;
        p1 = p2;
        p2 = p3;
        p3 = p3->next;
    }
    p2->next = p1;
    head->next = p2;        //尾变头
    return head;
}

逆の順序で一覧(再帰)

ノート:

  1. > ......-> P2-> P1->頭部> NULL - 再帰的なメソッドのpnによって返されます。使用する際の方法ので、注意する必要があります
Node* ReverseLinkListRecursive(Node* head){
    if(head == NULL || head->next == NULL){
        return head;
    }
    Node* second = head->next;
    Node* new_head = ReverseLinkListRecursive(second);
    second->next = head;
    head->next = NULL;
    return new_head;
}

ソートされたリンクリストのマージ

ノート:

  1. これは、2つのソートされたリストの方向に同じでなければなりません
  2. リストが空の場合は、別のリストに直接戻ります
  3. 通常、最初のノードは、ヘッドの現時点でデータがリンクされたリスト内のノードのどの予め決めないである必要はありません。最初のノードが含まれている場合は、データとは、リンクリストのリストの新しいヘッドを特定する必要があります。
  4. どのノードを決定リストの新しいヘッド、またはリストのいくつかの例に(new_head->次= P1)間違っている可能にする最初の要素です。
  5. ノードがリストの二つの要素がまだあるかどうかを決定することによって、空である、最後の要素のポインタは、次のノードがリストの部分を通ってサイクルが欠落していると判定された場合
  6. ループは、第一リンクリスト、最初に他の残りのノードにリンクされたリスト・ポインタを持っている場合。
Node* MergeLinkList(Node* head1,Node* head2){
    Node *p1,*p2,*pcur;
    Node *new_head = new Node;  //一定要开辟空间
    if(head1->next == NULL){
        return head2;
    }
    if(head2->next == NULL){
        return head1;
    }
    if(head1->next == NULL && head2->next == NULL){
        new_head = NULL;
        return new_head;
    }
    //确定新链表的头结点
    p1 = head1->next;
    p2 = head2->next;
    /*
    if(p1->data <= p2->data){       //这一步是可以省的
        new_head->next = p1;
        p1 = p1->next;
    }
    else{
        new_head->next = p2;
        p2 = p2->next;
    }
    pcur = new_head->next;
    */
    pcur = new_head;
    while(p1 != NULL && p2 !=NULL){
        if(p1->data <= p2->data){
            pcur->next = p1;
            pcur = pcur->next;
            p1 = p1->next;
        }
        else{
            pcur->next = p2;
            pcur = pcur->next;
            p2 = p2->next;
        }
    }
    if(p1){
        pcur->next = p1;
    }
    else{
        pcur->next = p2;
    }
    return new_head;
}

おすすめ

転載: www.cnblogs.com/ziyuemeng/p/12370249.html