2016-10-05 3 views
1

링크 된 목록에서 지정된 노드를 삭제하려고합니다. 왜 내 코드가 작동하지 않는지 모르겠다. 어떤 힌트?링크 된 목록에서 노드 삭제

public void delete (int k) { 
    //[ 11 21 31 41 ].delete(2): expected=[ 11 21 41 ] 
    if (k < 0 || k >= N) throw new IllegalArgumentException(); 

    for(Node x = first; x != null; x = x.next) { 
     //deletes node 
     if(x.item == k){ 
      x = x.next; 
     } 
     if(x.item <= k){ 
      x = x.next.next; 
     } 
    } 


} 

누군가가 말해 줄 수 왜하십시오 그래서 [11,21,31,41]을 가지고 있고이 경우 31에서 인덱스 2에서 노드를 삭제하라고 요구하고 지금까지이있다 이거 작동하지 않아? 고맙습니다.

+0

오류가 무엇을지고 해결할 수있는 몇 가지 예제 코드를? 아니면 그냥 요소를 제거하지 않습니다. – denis

+0

그것은 요소를 전혀 제거하지 않습니다 ... – Hello

+1

삭제하려는 노드의 다음 노드로 이전 노드의 다음 노드를 설정해야합니다 (단일 연결 목록 가정) – Zarwan

답변

0

k 번을 사용하여 노드를 이동할 수 있습니다. 임시 int와 이전 노드를 저장하십시오. next()에 전화 할 때마다 임시 int 값을 줄입니다. 0 (원하는 요소)에 도달하면 이전 노드의 다음 포인터를 x의 다음 포인터로 설정하여 제거한 다음 xnull으로 설정합니다.

코드에서 포인터가 설정된 부분이 누락되었다고 생각합니다. 예를 들어

:

(1) -> (2) -> (3) 

(2)를 제거하려면, (1).next = (3)(2) = null 설정합니다. 여기에서 잘못가는 몇 가지가 있습니다

(1) -> (3) 
0

, 그리고 당신이 개발할 때 더 문제를 이해하기 위해 몇 가지에 println 디버깅 작업을하는 것이 좋습니다 :이 얻을 것이다. item 필드를 가정

  1. 노드의 값입니다, 당신의 인덱스에 노드의 값을 비교하고 (예를 들어, x.item == k) 노드는 말했다.

  2. 당신이 따라하고 싶은거야 일반적인 논리는 "반복자가 가리키는 노드는 다음 노드 내 목록에있는 경우, 내 nextnext로 설정합니다."입니다

0

코드에서 전달한 색인과 노드의 값을 비교합니다. 이 비교는 노드에서 항상 인덱스보다 값이 작습니다. 또한 그 후에는 코드가 맞다고 가정 할 때 노드를 업데이트하지 않습니다.

아래 코드는 결과를 제공합니다.

public void delete (int k) 
{ 
//[ 11 21 31 41 ].delete(2): expected=[ 11 21 41 ] 
if (k < 0 || k >= N) throw new IllegalArgumentException(); 
int count = 0;//Assuming index starts from 0 
Node prev; 
for(Node x = first; x != null; x = x.next) 
{ 
    //deletes node 
    count++; 
    if(count<k) 
    { 
     prev = x; 
     continue; 
    } 
    else 
    { 
     prev.next = x.next; 
     x.next = null; 
     break; 
    } 

} 
if(count>k || count<k) 
{ 
    System.out.println("No element with index k"); 
} 
} 
0

@vase, 당신의 인덱스 노드의 값이 노드를 말했다 을 비교하고있는 노드의 값을 항목 필드를 가정 할

말을 정확 (egxitem == 케이).

public void delete(int k){ 
    Node n = first; 
    for(int i = 0; i < k-1; i++){ // this loop finds the node right before the 
    n=n.next;     // index to use to delete the desired index. 
} 
    n.next = n.next.next; // delete command 
}