ハッピーラーニングリンクリスト1(リンクリストの質問の概要)

コンテンツ

1.整数へのバイナリリンクリスト

2.リンクリストのノードを削除します

3.リンクリスト要素を削除します

 4.順序付きリストをマージします

5.リンクリストの中間ノード

6.リンクリスト内の重複要素を削除します

最後に書く


1.整数へのバイナリリンクリスト

元のタイトルリンク:1290。整数へのバイナリリンクリスト-LeetCode(leetcode-cn.com)

アイデア:ノードごとに変換します。1の場合は加算します。0の場合は次のデータを判断します。すべてのデータの加算は10進数です。

コードは次のように表示されます。

int getDecimalValue(struct ListNode* head){
    struct ListNode *p=head;
    int sum=0;
    while(p){
        sum+=p->val;
        p=p->next;
        if(p)
            sum<<=1;//左移,用来将一个数的各二进制位全部左移1位,右补0
    }
    return sum;
}

2.リンクリストのノードを削除します

元のタイトルリンク:237。リンクリスト内のノードを削除します-LeetCode(leetcode-cn.com)

アイデア:次のノードのデータを削除する必要のあるノードにコピーします。

コードは次のように表示されます。

void deleteNode(struct ListNode* node) {
    node->val=node->next->val;
    node->next=node->next->next;
}

3.リンクリスト要素を削除します

元のタイトルリンク:203。リンクリスト要素を削除します-LeetCode(leetcode-cn.com)

 アイデア:削除する要素ノードのポインタフィールドを次のノードにポイントします。ノードがリンクリストの最後にある場合は、ポインタフィールドを直接NULLにポイントします。

コードは次のように表示されます。

法一:

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode *prev=NULL,*cur=head;//prev为cur的前一个节点
    while(cur)
    {
        if(cur->val==val)
        {
            if(cur==head)//所需移除元素在链表头部时
            {
                head=cur->next;
                cur=head;
            }
            else
            {
                prev->next = cur->next;
                free(cur);
                cur=prev->next;
            }
        }
        else
        {
            prev = cur;
            cur=cur->next;
        }
    }
    return head;
}

法二:

struct ListNode* removeElements(struct ListNode* head, int val){
   while(1)
   {
       if(head==NULL)return NULL;//判断链表是否为空
       if(head->val==val)
       {
           head=head->next;
           continue;
       }//判断头节点
       struct ListNode *cur=head;
       while(cur){
           if(cur->val==val)
           {
               break;
           }
           cur=cur->next;
       }//遍历链表
       if(cur==NULL)return head;
       cur=head;
       while(cur->next->val!=val)
       {
           cur=cur->next;
       }//寻找删除元素
       struct ListNode *q;
       q=cur->next;
       cur->next=q->next;
       free(q);
   }
}

 4.順序付きリストをマージします

元のタイトルへのリンク:21。2つの順序付きリストをマージします-LeetCode(leetcode-cn.com)

アイデア:

 コードは次のように表示されます。

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    if(l1==NULL){
        return l2;
    }
    if(l2==NULL){
        return l1;
    }//判断是否有空链表,若有则无需合并
    struct ListNode *head=NULL,*tail=NULL;
    while(l1&&l2)
    {
        if(l1->val < l2->val){
            if(head==NULL){
                head=tail=l1;
            }
            else{
                tail->next=l1;
                tail=l1;
            }
            l1=l1->next;
        }
        else{
            if(head==NULL){
                head=tail=l2;
            }
            else{
                tail->next=l2;
                tail=l2;
            }
            l2=l2->next;
        }
    }
//若两个链表其中一个已经到了链表尾部
    if(l1){
        tail->next=l1;
    }
    else{
        tail->next=l2;
    }
    return head;
}

5.リンクリストの中間ノード

元のタイトルリンク:876。リンクリストの中央ノード-LeetCode(leetcode-cn.com)

 アイデア:2つのポインターを定義します。1つは高速でもう1つは低速で、低速は一度に1つのノードをウォークし、高速は一度に2つのノードをウォークし、低速は高速が終了するとリンクリストの中央に移動します。

コードは次のように表示されます。

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode *slow=head,*fast=head;
    if(head==NULL){
        return NULL;
    }
    while(fast&&fast->next){
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

6.リンクリスト内の重複要素を削除します

元のタイトルへのリンク:83。並べ替えられたリスト内の重複する要素を削除する-LeetCode(leetcode-cn.com)

 アイデア:高速ポインターと低速ポインターのペアを定義します。同じ要素がある場合は、後者のノードを解放します。

コードは次のように表示されます。

struct ListNode* deleteDuplicates(struct ListNode* head){
    struct ListNode* cur=head,*prev=NULL;
    if(head==NULL)return NULL;//判读链表是否为空
    if(head!=NULL)
    {
        prev=cur;
        cur=prev->next;
    }//判断前两个节点
//遍历链表
    while(cur){
        if(prev->val==cur->val)
        {
            prev->next=cur->next;
            printf("prev:%p\n",prev);
            free(cur);
            cur=prev->next;
            printf("prev:%p\n",prev);
        }
        else{
            prev=cur;
            cur=cur->next;
        }
    }
    return head;
}

最後に書く

以上がこの記事の全内容です。作者の知識レベルは限られています。間違いや改善点があれば、みんなに指摘してもらいたいです。もっと良いコードがあれば、ブロガーにメッセージを残してください。ブロガーはCSDNであなたと一緒に進歩することを望んでいます。

おすすめ

転載: blog.csdn.net/qq_61139806/article/details/124413372