2014-11-11 9 views
0

내 연결된 목록 y에서 내 첫 번째 값을 제거하려고하지만 내 코드가 맞으면 잘 모르겠다 내 마지막 제거 잘하고 있지만 내 removeFirst 않습니다. 여기 첫 번째 연결된 목록에서 제거

public class IntegerLinkedList 
    { 
     private class Node 
     { 
      public int value; 
      public Node next; 


      public Node(int v) 
      { 
       value = v; 
       next = null; 

      } 

      internal int removeLast() 
      { 
       int value; 
       if (next.next == null) 
       { 

        value = next.value; 
        next = null; 
        return value; 
       } 
       else 

        return next.removeLast(); 

      } 

      internal int removeFirst() 
      { 
       int value; 
       if (next.next != null) 
       { 
        value = next.value; 
        next = null; 
        return value; 

       } 

       else 
        return next.removeFirst(); 


      } 
     } 


     int count; 
     Node start; 

이 removeFirst와

public int removeFirst() 
{ 

    int value; 


if (start.next != null) 
    { 
     value = start.value; 

    } 
    else 

     value = start.removeFirst(); 
    return value; 
} 

}에 대한 내 코드 여기

내 링크 목록입니다

IntegerLinkedList myList = new IntegerLinkedList(); 
       myList.addFirst(1); 
       myList.addFirst(2); 
       myList.addFirst(3); 
       myList.addFirst(4); 


       Console.WriteLine(" expect to 4 to be removed" + myList.removeFirst()); 

} 

제거 4 표시하지만 난 확실하지 않다 thats corr 요법

+0

코드에서 public int removeFirst()는 어디에 있습니까? 그것은 당신의'IntegerLinkedList' 클래스 안에 있습니까? 그렇다면 왜 '공개'와 '내부'방법이 필요한가? – krillgar

+2

코드를 단계별로 실행 해보십시오. 'removeFirst()'의 첫번째 줄에 중단 점을 놓고 그것을 따라 가십시오. 그것이하는 일과 당신이 기대하는 것 이외의 일을하는 곳을보십시오. – krillgar

+0

Cos 내 내부 메소드는 노드 – RandomUsers

답변

1

이 코드는 :

internal int removeFirst() 
{ 
    int value; 
    if (next.next != null) 
    { 
     value = next.value; 
     next = null; 
     return value; 
    } 
    else 
     return next.removeFirst(); 
} 

재귀 목록을 순회가는 마지막 요소를 컷오프. 이는 removeLast과 실질적으로 동일합니다.

대신, 당신은 같은 것을 할 필요가 :

Node currentStart = start; 
start = start.next; 
return currentStart.value; 

는이 GCD 수 있도록 Node 객체는 더 이상 그것을 가리키는 모든 참조가 없어야한다 "시작".

빠른 메모; Node 클래스에서 "RemoveFirst"및 "RemoveLast"를 제거해야합니다. 그것들은 목록의 기능입니다; 노드가 아닙니다. (! 당신이 정상적으로)는리스트 클래스의 모든 메소드를 넣으면

,의 addFirst는 (의 addFirst해야합니다) 다음과 같습니다

public void AddFirst(int item) 
{ 
    Node newNode = new Node(); 
    newNode.value = item; 

    newNode.next = start; 
    start = newNode; 
} 

귀하의 addLast가 반복을 필요로 (또는 당신이 "꼬리를 추적하는 "node, your choice) :

public void AddLast(int item) 
{ 
    Node newNode = new Node(); 
    newNode.value = item; 

    Node tailNode = start; 
    while (tailNode.next != null) 
     tailNode = tailNode.next; 

    //In C++ you could cheat and do: while (tailNode = tailNode.next != null); 

    //Tail node is now at the end 
    tailNode.next = newNode; 
} 
+0

이라는 클래스 여야합니다. 그렇다면 어디에서 노드의 현재 시작 부분을 코드에 넣을 수 있습니까? 내 내부 메서드를 제거해야합니까 – RandomUsers

+0

@RandomUsers'start' 노드는 목록 클래스에 속합니다. 무작위로, 그 노드는 더 일반적으로 "머리"라고합니다. – BradleyDotNET

+0

@badleyDotNet 나는 올바른 생각을 가지고 있었습니까 ?? – RandomUsers

관련 문제