2013-10-24 8 views
0

이 코드를 사용하여 연결된 목록에서 항목을 제거하고 있습니다. 그래서 목록은 {3,3,7,8,4,3,0,4}입니다. 그리고 3을 모두 제거하고 싶습니다. 출력이 7, 8, 4, 0, 4가되어야합니다.연결된 목록을 사용하여 항목 제거

내가 만든 코드는 오직 3 개 중 하나만 제거하는 것이지 모두 제거하는 것은 아닙니다.

public void eraseNumber(Object x) 
{ 
    if (start == null) 
    return; 
    else if (start.data.equals(x)) { 
    start = start.next; 
    count--; 
    } 
    else { 
    Node ptr; 
    for (ptr = start; ptr.next != null; ptr = ptr.next) { 
     if (ptr.next.data.equals(x)) { 
     ptr.next = ptr.next.next; 
     count--; 
     return; 
     } 
    } 
    } 

아웃 된이 코드는의 번호를 제거 할 경우 내가 3, 7, 8, 4, 3, 0, 4

+0

숙제 문제입니까? – jimbojw

+1

'Object'는 정말로 당신이 할 수있는/당신의 방법에 대한 입력으로 사용할 수있는 가장 구체적인 것입니까? 메소드가'Object'보다 더 구체적인 방법 인'eraseNumber'라는 이름으로 물어 봅니다. – TheMorph

+0

감사합니다. – DaBulls33

답변

0

당신은 단순히 방법에서 보내고 return있어 무엇입니까 넣어 이 경우 start에 있거나 일치하는 내용이 for 루프에 있습니다. 프로그램에서 for 루프를 실행하고 return;을 제거하여 모든 목록 요소를 반복하도록하려면 if-else을 제거해야합니다.

목록의 start에서 일치하는 모든 숫자를 제거하려면 while 루프를 사용합니다. 이 이후

while (start != null && start.data.equals(x)) { // use while here 
start = start.next; 
count--; 
} 

for (Node ptr = start; ptr != null && ptr.next != null;) { 
    if (ptr.next.data.equals(x)) { 
    ptr.next = ptr.next.next; 
    count--; 
    } else // conditional increment 
    ptr = ptr.next; 
} 
+0

코드의 아래쪽 절반에 while 루프를 사용하면 확실히 NullPointerException이 발생합니다. – TheMorph

+0

@TheMorph 캐치를 가져 주셔서 감사합니다. 나는'while'을 전부 버렸습니다. 이전과 같이 연속적인 일치를 제거하면서 루프 * 방식의 * 루프가 마음에 들지 않았습니다. –

0

코드 최종 else를 입력하지 않고 상기 방법을 종료한다 후 제 elseif를 입력합니다 if-elseIf 구조체이다.

while 또는 for 루프를 사용하면 연결된 목록을 반복 할 수 있습니다.

0

if 문에서 return을하면 코드가 if 문에서 나오고 for 루프에서 아무것도 발견되면 종료됩니다. 따라서 처음으로 3을 찾으면 for 루프를 종료합니다. 반환을 제거하고 제대로 작동합니다.

0

라비는 allready, 메신저 확실하지 않은 당신에게 방법을 말했다하지만 난

if (start == null) 
return; 
while (start.data.equals(x)) { // use while here 
start = start.next; 
count--; 
} 
Node ptr; 
for (ptr = start; ptr.next != null; ptr = ptr.next) { 
    while (ptr.next != null && ptr.next.data.equals(x)) { //while to remove a sequence of 3's 
    ptr.next = ptr.next.next; 
    count--; 
    // return; don't exit here 
    } 
} 
+0

코드의 아래쪽 절반에서 while 루프를 사용하면 확실히 NullPointerException이 발생합니다. – TheMorph

+0

thats 사실, 내가 루프에 두 번째 조건을 추가했습니다 – YAMM

+0

당신은 for 루프의 일부 기능을 while 루프와 중복 시켰습니다. 당신은 정말로 그것을 필요로하지 않습니다. 'if'는 완벽하게 작동합니다. – TheMorph

0

내가 여러 가지를 볼 때와 경우에 u는 또한 대체해야한다고 생각 :

모든 마지막 return 문의

첫 번째는 만들 것 메서드는 x과 같은 요소를 처음 발견 할 때 반환됩니다. 제거해야합니다. 이것은 오류의 원인 중 하나입니다.

start의 시작 부분에있는 모든 x을 찾으려면 while 루프를 사용하고 싶다고 생각합니까?

else if (start.data.equals(x)) { 
    start = start.next; 
    count--; 
} 

이제 start는 하나 개의 요소로 구성하면 어떻게,이 하나 개의 요소도 x 같다 무엇을보고? 여기에 예외가 발생합니다

for (ptr = start; ptr.next != null; ptr = ptr.next) { 

null.next이 존재하지 않으므로 예외가 발생합니다. 실제로 while 루프에서는 더 나빠질 것이지만 다행스럽게 null 테스트가 도움이 될 것입니다.;)

이제 더 많은 화장품 일 :

if (start == null) 
    return; 
else if (start.data.equals(x)) { 

심지어 불구하고, 읽기가 좀 더 쉽게이되는 else를 생략하여

if (start == null) 
    return; 
if (start.data.equals(x)) { 

로 기록 될 수있다 똑같은 행동을 할 것이다.


이것은 내가 쓸 것 인 것이다 :

public void eraseNumber(Object x) { 

    while (start != null && start.data.equals(x) { 
     start = start.next; 
     count--; 
    } 

    Node lastNode = start; 
    Node currentNode = start; 

    while (currentNode != null) { 
     if (currentNode.data.equals(x)) { 
     lastNode.next = currentNode.next; 
     count--; 
     } else { 
     lastNode = currentNode; 
     } 
     currentNode = currentNode.next; 
    } 

} 

당신은 더 구체적인 뭔가 Object을 대체 할 수 있습니다.

참고 : 구현시 링크 된 목록의 첫 x이 누락 된 버그를 수정해야했습니다.

관련 문제