C言語リスト反転II(指定された2つのノード反転)

要件:

nは位置Mからの逆リスト。完全な逆転でスキャンへの旅行をご使用ください。

説明:
1≤≤M≤N-長のリスト。

例:

入力:1-> 2-> 3-> 4- > 5-> NULL、M = 2、N = 4
出力:1-> 4-> 3-> 2- > 5-> NULL

反復逆方向リンク

アルゴリズム

特定のアルゴリズムを見る前に、逆方向リンクとそのポインタを必要とする原則を明確にする必要があります。例えば、3つの異なるノードがA→B→Cからなるリストを持って、逆方向リンクの必要性は、ノードA←B←Cであることが

ノードAを指して、私たちは二つのポインタを持っていると仮定し、ノードポイントB. 彼らは前とCURとして記録しました。2つのポインタは、単純にAとBの間のリンクを反転実現することができます。

cur.next =前の
唯一の問題はありそう、継続する方法がない、言い換えれば、そうした後、あなたは、もはやノードCへのアクセス権を持っていません したがって、我々はプロセスを逆に助けのための第三のポインタを導入する必要があります。したがって、我々は、上記反転法を使用しますが、しないでください。

= cur.next THIRD
cur.next = PREV
前= CUR
CUR = THIRD
繰り返し問題の要件を完了するための手順を上記の。アルゴリズムのステップで見てみましょう。

1.としては、我々は二つのポインタprevをとCURを必要とし、前述しました。
2.prevポインタはCURポインタは、リストの先頭に初期化され、Noneに初期化されます。
フォワードCURポインタ、前のポインタの追跡を移動させるステップ3.ステップ。
ポインタがリストの先頭からノードのCURミリメートルに達するまで4.したがって、2つのポインタを進めます。これは、我々はリストを逆転開始位置です。
5.通知は、我々は、2つの追加のポインタと呼ばれるテールとコンを紹介したいということ。リストの先頭から最初のノードmmのテール・ポインタポイントは、この接合部が逆になると、リストの末尾、いわゆる尾。MM-ノードの前に最初のノードへのコンポインタは、このノードは、リストの新しいヘッドです。次の図は、あなたがより良いこれら二つのポインタを理解するのに役立ちます。

 

アルゴリズムの冒頭に6.tailと詐欺ポインタが最後には完全なリストの逆転のためのアルゴリズムと呼ばれ、初期化されます。
7としては、以前反復逆方向リンクに、二つのポインタを使用する前に、ノードMMの到着後、説明しました。最初NN-ノードへのリンクが完了するまで反復するために続けます。このとき、前のポインタは、nnは最初のノードを指しています。
前のポインタノード(最初のノードがNN)ため8.我々は、ノードMMの現在のポインティング位置を交換し、CON PREVポインタはポインタに接続されている使用します。ノード(N + 1N + 1つのノード)同様後、我々は前のポインタを接続テール・ポインタを使用します。
整理して各ポインタの使用を容易にするために、我々は、アルゴリズムを実行する例を見てください。リスト所与7→9→2→10→ 1→8→6、 我々は第6ノードに第三のノードのリンクされたリストを逆にする必要があります

 

 

 

マップからは、反復法の最初のステップを見ることができます。最初のステップを示して二つのポインタの初期化は、第3のステップは反転プロセスのリストで初期位置を示しています。

 

 

詳細図に示す順方向、逆方向リンクの移動と逆方向、逆方向リンク2つのノードにプロセスおよび方法。以下に示すように、このステップを複数回実行されます。

 

如上图所示, 两个指针都已经到达最终位置。我们完成了子链表的反转工作。然而,还有一些链接需要调整。下图展示了利用 tail 和 con 指针完成链接调整的过程。

 

 


以上链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/solution/fan-zhuan-lian-biao-ii-by-leetcode/

 Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

typedef struct ListNode * PNODE ;
typedef struct ListNode NODE ;
struct ListNode* reverseBetween(struct ListNode* phead, int m, int n){
    PNODE prev=NULL ;
    PNODE curr=phead;
    PNODE temp=NULL ;
    PNODE con =NULL ;
    PNODE tail=NULL ;
   if(phead==NULL)
   {
        return NULL ;
   }
   while(m>1)
   {
    prev=curr;
    curr=curr->next;
    m-- ;
    n-- ;
   }
   con=prev ;
   tail=curr ;
   while(n>0)
   {
    temp=curr->next;
    curr->next=prev;
    prev=curr;
    curr=temp;
    n--;
   }
   //调整算法连接
   if(con!=NULL)
   {
    con->next=prev ;
   }
   else
   {
    phead=prev ;
   }
   tail->next=curr ;
   return phead ;
}

おすすめ

転載: www.cnblogs.com/cocobear9/p/12370081.html