チェーンテーブルクラスのアルゴリズム問題の要約

2187 ワード

アルゴリズムのテーマでよく考察されるチェーンテーブルの操作は以下のいくつかにほかならない.
  • チェーンテーブル反転
  • チェーンテーブル統合
  • チェーンテーブルの中点
  • を探します
  • チェーンテーブルの最後からK番目のノード
  • を探す
  • チェーンテーブルノード
  • を削除する.
  • チェーンテーブルにリングがあるか否かを判断する
  • .
  • の2つのチェーンテーブルの第1の共通ノード
  • 複雑なチェーンテーブルのレプリケーション
  • 143. Reorder List
    Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
    You may not modify the values in the list's nodes, only nodes itself may be changed.
    Example 1:
    Given 1->2->3->4, reorder it to 1->4->2->3.
    

    Example 2:
    Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
    
    Hint:
    問題を解く構想:1.スナップポインタを使用してチェーンテーブルの中点2を見つける.中点からチェーンテーブルを切り離し、A、Bの2段に分ける.中点を反転する後のBセグメントチェーンテーブルノード(詳細に注意、4ステップ反転)4.A、Bの2つのセグメントチェーンテーブルをループし、第2のセグメントチェーンテーブルノードを第1のセグメントチェーンテーブルに間隔を置いて挿入する
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        void reorderList(ListNode* head) {
            
            // 
            if(head == nullptr || head->next == nullptr || head->next->next == nullptr) return;
            
            ListNode* slow = head;
            ListNode* fast = head;
            
            while(fast->next && fast->next->next){
                slow = slow->next;
                fast = fast->next->next;
            }
            
            //     
            ListNode* mid = slow->next;
            //        
            slow->next = nullptr;
            
            //         
            ListNode* last = mid;
            ListNode* prev = nullptr;
            while(last){
                ListNode* next = last->next;
                last->next = prev;
                prev = last;
                last = next;
            }
            
            //           
            while(head && prev){
                ListNode* next = head->next;
                head->next = prev;
                prev = prev->next;
                head->next->next = next;
                head = next;
            }
        }
    };