単一リンクリストを逆にする2つの方法
方法1:
まず、5つの要素で単一リンクリストを作成し、3つのポインターを定義します。curとnextはそれぞれ、ヘッドノードとその次のノードであるnewheadポインターを指し、新しいヘッドノードを格納します(newheadの初期値はNULLです)。
図に示すように:
2番目のステップは、cur-> newheadの横をポイントし、curの値をnewheadに割り当ててから、前後に移動します。このとき、curは番号2を指し、次のポイントは3を指します(次のようになります)。図:(このステップは切断されています1と2、1の間の接続が新しいヘッドノードになります。単一リンクリストのヘッド挿入と同様に、このステップを繰り返します)
次のサイクルステップは、写真で示されています。
最後のステップで、curはNULLを指し、ループは終了します。この時点で、newheadは反転リストのヘッドノードです。
以下は、特定のコード実装です:(単一リンクリスト構造の定義は含まれていません)
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode*cur;
struct ListNode*next;
struct ListNode*newhead=NULL;
cur=head;
while(cur)
{
next=cur->next;
cur->next=newhead;
newhead=cur;
cur=next;
}
return newhead;
}
方法2
2番目の方法は最初の方法よりも理解しやすいです。3つのポインターn1、n2、n3、n1の初期値はNULL、n2はリンクリストのヘッドノード、n3はn2の次のノードです。下の図。:
次の手順は方法1と同様で、図に示すように、n2とn3の間の接続を切断し、n2がn1を指すようにしてから、n1、n2、n3を更新します。
次に、n2がNULLの終わりを指し、n1が反転後のリンクリストのヘッドノードになるまでループを続けます。
コードは次のように表示されます。
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*n1,*n2,*n3;
n1=NULl;
n2=head;
n3=n2->next;
while(n2)
{
n2-next=n1;
n1=n2;
n2=n3;
if(n3) //判断n3是否存在,若不存在则无需后续操作
n3=n3->next;
}
return n1;
}
3;
if(n3) //判断n3是否存在,若不存在则无需后续操作
n3=n3->next;
}
return n1;
}
最後に、このトピックのleetcodeリンクを添付します。LeetCodeReversalSingly Linked List(単一リンクリストの構造の特定の定義が含まれています)