2017-01-03 5 views
0

私はコーディングインタビューをクラッキングする上で問題を練習していました。リンクされたリストの中のノードを削除するように求める問題の解決策を思いつきました。現在のノードをNullに設定しますか?

public void deleteMidNode(Node mid){ 
    if(mid == head || mid.next==null){ 
     return; 
    } 
    Node current = mid; 
    while(current.next.next!=null){ 
     current.data = current.next.data; 
     current = current.next; 
    } 
    current.next = null; 
} 

このコードは機能します。これをテストしました。しかし、私は私がnullにcurrent.nextを設定することができます理由として興味が、私はこれを行うにした場合、それは動作しません:

public void deleteMidNode(Node mid){ 
    if(mid == head || mid.next==null){ 
     return; 
    } 

    Node current = mid; 
    while(current.next!=null){ 
     current.data = current.next.data; 
     current = current.next; 
    } 
    current = null;  
} 

私は、現在のノードを設定することはできません、なぜ誰も教えてもらえますnull

+0

なぜそれが頭や尾である場合は、打ち切りますか? – weston

+2

'current = null'はこの変数の値を単に代入するだけです。基底の 'Node'オブジェクトは変更されません。 –

+0

これは正しくありません。リンクされたリストから項目を削除するには、O(1)一定時間手順を使用する必要があります。 O(n) – weston

答えて

1

あなたの質問に答えるには、デッドコードの例です。これはローカル変数です。最後の書き込みは後でコードで読み取られないので、プログラムには影響しません。

です:

current = null; 
    //there are no reads of "current" here before: 
} //the end of method which is the end of scope for the local "current" 

まともなIDEは、例えば、アンダーラインまたはその他のデッドコードを強調し、グレーアウトにより、この書き込みが読まれていなかったことをあなたにほのめかしされるだろう。

あなたのコードをあまりにも細かく分析する価値はないと思いますが、私は恐れがあります。リンクされたリストから項目を削除するには、一定の時間が必要です(少なくともノードおよび前のノードが位置する)。データを移動してO(n)にすると、データの配列から取り除くより効率的ではありません。

この考える:

node1 -> node2 -> node3 -> node4 
    |  |  |  | 
data1 data2 data3 data4 

node2を削除、に行く必要があります。

node1 -> node3 -> node4 
    |  |  | 
data1 data3 data4 

しかし、あなたは、アレイ内に沿って項目をシャッフルするかのようにデータを移動。これは、それがために発生します

node1 -> node2 -> node3 
    |  |  | 
data1 data3 data4 

current.dataは、任意のリンクリスト操作のために再割り当てする必要はありません。

1

あなたのリストは二重にリンクされていますか?その場合は、あなただけの

if (mid != null) { 
    mid.prev.next = mid.next 
    mid.next.prev = mid.prev 
} 

を行うと、ガベージコレクションは、その魔法をやらせることができます。

質問に答えるには、Javaのオブジェクト(Nodeなど)の変数は常に参照(ポインタ)であることに気付きます。

currentは、Nodeオブジェクトを指す変数です。 nullに設定すると、どこにも指摘されません。しかし、それはリストの構造を変えない。

+2

二重リンクリストの場合、次のノードのprevポインタも更新する必要があります: 'mid.next.prev = mid.prev' – digitalbath

+0

ありがとうございます。追加されました。 – Lagerbaer

1

ダブルリンクされたリストの場合、mid.preをmid.nextにリンクする必要があります。シングルリンクのリストであれば、最初から最後までトラバースする必要があります(以前のノードPrv.next = midが必要です)。prv.next = mid.nextを置き換えてください。

質問:両方のソリューションで、ノードの中央を取り除いた後、どうやってヘッドからトラバースできますか?それは以下のコードのための最初のすべてのコンパイルエラーを与えていない理由

0

私はそれを得ることはありません:あなたはノードへのノードのポインタを割り当てているので、

current = current.next; 

これは、コンパイルエラーを与える必要があります。

ポインタを渡しているときに同じ関数を実行すると、その関数が機能します。

#include<stdio.h> 
#include<malloc.h> // C library to handle malloc functions 

struct node{ // struct node declaration 
    int data; 
    struct node* link; 
}; 
void deleteNode(struct node*); 
void printList(struct node*); 
int main(){ 
    struct node* head; 
    struct node* first; 
    struct node* second; 
    struct node* third; 
    struct node* fourth; 
    struct node* fifth; 
    struct node* sixth; 
    head = (struct node*)malloc(sizeof(struct node)); 
    first = (struct node*)malloc(sizeof(struct node)); 
    second = (struct node*)malloc(sizeof(struct node)); 
    third = (struct node*)malloc(sizeof(struct node)); 
    fourth = (struct node*)malloc(sizeof(struct node)); 
    fifth = (struct node*)malloc(sizeof(struct node)); 
    sixth = (struct node*)malloc(sizeof(struct node)); 
    head->link = first; 
    first->link = second; 
    second->link = third; 
    third->link = fourth; 
    fourth->link = fifth; 
    fifth->link = sixth; 
    sixth->link = NULL; 
    head-> data = 1; 
    first-> data = 2; 
    second-> data = 3; 
    third-> data = 4; 
    fourth-> data = 5; 
    fifth-> data = 6; 
    sixth-> data = 7; 
    printList(head); 
    deleteNode(second); 
    printList(head); 
} 
void printList(struct node* head){ 
    struct node* node = head; 
    while(node->link!= NULL){ 
     printf("%d\n",node->data); 
     node= node->link; 
    } 
} 
void deleteNode(struct node* kid){ 
    struct node* mid = kid; 
    while(mid->link!= NULL){ 
     mid->data = mid->link->data; 
     mid = mid->link; 
    } 
    mid = NULL; 
} 
関連する問題