2016-11-06 4 views
0

단일 링크 된 목록에서 마지막 노드를 삭제하려고합니다. 하지만 여전히 코드에서이 오류를 해결할 수 없습니다. 내 deleteFromEnd 메서드는 마지막 노드를 제거하지 않습니다. delete 메소드를 호출 한 후에도 삭제할 노드가 표시됩니다. 나머지 목록은 삭제되지만 마지막 노드 자체는 제거되지 않습니다. 제가 누락 된 부분이나 오류가있는 부분을 말씀해 주시겠습니까?링크 된 목록의 마지막 노드를 삭제할 수 없습니다.

LinkedList의 :

package lab5; 

public class LinkedList { 

    public static void main(String argsp[]) { 
     List ob = new List(); 

     ob.addAtStart("y", 6); 
     ob.addAtStart("w", 4); 
     ob.addAtStart("z", 3); 

     ob.addAtEnd("a", 3); 
     ob.addAtEnd("b", 4); 
     ob.addAtEnd("c", 5); 

     /* 
     * ob.display(); System.out.println("Deleted first one"); 
     * ob.deleteFromStart(); 
     */ 
     ob.display(); 
     System.out.println("Deleted End one"); 
     ob.deleteFromEnd(); 
     ob.display(); 
    } 
} 

목록 :

package lab5; 

public class List { 

    Node head; 

    public List() { 
     head = null; 
    } 

    public List(Node e) { 
     head = e; 
    } 

    Node oldfirst = null; 
    Node lasthead = null; 

    public void addAtStart(String name, int age) { 
     Node newObject = new Node(name, age); 
     newObject.next = head; 

     if (oldfirst == null) { 
      oldfirst = newObject; 
     } 
     head = newObject; 
     lasthead = head; 

    } 

    public void display() { 
     Node store = head; 
     while (store != null) { 
      store.display(); 
      store = store.next; 
      System.out.println(); 
     } 
    } 

    public void addAtEnd(String name, int age) { 
     Node atEndValue = new Node(name, age); 
     oldfirst.next = atEndValue; 
     oldfirst = atEndValue; 
    } 

    public void deleteFromStart() { 
     if (head.next != null) { 
      head = head.next; 
     } 
    } 

    public void deleteFromEnd() { 
     Node start = head; 
     Node prev = null; 
     while (head != null) { 
      prev = head; 
      head = head.next; 
     } 
     prev.next = null; 
     head = prev; 
    } 

    public Node search(String name) { 
     return head; 
    } 

    public boolean isEmpty() { 
     return head == null; 
    } 

    public int size() { 
     return (head.toString()).length(); 
    } 
} 

노드 :

package lab5; 

public class Node { 

    String name; 
    int age; 
    Node next; 

    public Node() { 
     name = "Abc"; 
     age = 10; 
     next = null; 
    } 

    public Node(String name, int age) { 
     this.name = name; 
     this.age = age; 
     next = null; 
    } 

    public void display() { 
     System.out.println("Name: " + name + " Age: " + age); 
    } 
} 
+0

@nbrooks는 이제 새로운 질문을했다. – Shahzad

+0

'head = head.next; '의 요점은 무엇입니까? – shmosel

+0

로컬 변수'start' 대신'head'를 사용하고 있습니다. – shmosel

답변

1

. 다음의 방법은 나를 위해 일했습니다.

public void deleteFromEnd() { 
     Node start = head; 
     Node prev = null; 

     if(start == null || start.next == null) 
     { 
      head = null; 
      return; 
     } 
     while (start.next != null) { 
      prev = start; 
      start = start.next; 
     } 
     prev.next = null; 
    } 

코드를 조금 더 분석 한 후에 다른 몇 가지 문제점을 발견했습니다. addAtStartaddAtEnd 방법을 업데이트해야합니다.

Node lasthead = null; 

public void addAtStart(String name, int age) { 
    Node newObject = new Node(name, age); 
    newObject.next = head; 
    if(head == null) 
     lasthead = newObject; 
    else if(head.next == null) 
     lasthead = head; 

    head = newObject; 

} 


public void addAtEnd(String name, int age) { 
    Node atEndValue = new Node(name, age); 
    lasthead.next = atEndValue; 
    lasthead = atEndValue; 
} 

이유는 목록의 끝에서 단일 노드를 삭제한다고 가정합니다. 나는 목록의 끝에 요소를 추가 할 수 없을 것이다. 당신이 싱글 링크드리스트의 끝에서 삭제되면

+0

감사합니다. 와우! 고마워. 내 코드를 검토하고 싶습니까? 하나의 코멘트에서 코드가 얼마나 좋고 나쁘습니까? 이것이시기 적절하지는 않지만 제발 알 수 있습니다. – Shahzad

+0

@BadarShahzadKhan 여기에 새 질문으로 게시 할 수 있습니다. http : //codereview.stackexchange.com/ – iNan

+1

@iNan 참고 :이 코드는 일부 모서리의 경우에 문제가 있습니다. 즉, 목록에 하나의 요소 만 있습니다. – simon

0

는 링크 된 L의 머리를 변경하지 마십시오 그렇지 않으면 목록을 잃어 버릴 것입니다. 함수의 수정 다음보십시오 : 당신은 잘못리스트의 헤드 포인터를 수정하는

public void deleteFromEnd() { 
     Node start = head; 
     Node prev = null; 
     if(start == null){ 
      return; 
     } 
     if (start.next == null){ 
      head = null; 
      return; 
     } 
     while (start.next != null) { 
      prev = start; 
      start = start.next; 
     } 
     prev.next = null; 
    } 
1

당신은 일해야 할 : 목록 트래버스

  1. 을하고 참조 할 수있는 변수를 만들 초 - 투 - 마지막으로 목록의 요소.

  2. 를 설정 마지막에서 두 번째 노드 이후의 노드가 연결된 목록을 통과하면서 그 효과적으로 전체 목록을 삭제하기 때문에 당신은 head의 값을 변경해서는 안

null이 될 수 있습니다. head 변수를 덮어 쓴 이후 처음으로 돌아갈 길이 없습니다. 대신 head으로 초기화되는 임시 변수를 사용하여 반복합니다.

마지막으로, 목록 만 한 요소가, 이미 비어 가장자리 케이스를 고려하는 기억

public void deleteFromEnd() { 
    Node current = head; 
    Node previous = null; 

    while (current != null && current.next != null) { 
     previous = current; 
     current = current.next; 
    } 

    if (current == head) { 
     head = null; 
    } 

    if (previous != null) { 
     previous.next = null; 
    } 
} 
+0

감사합니다. @nbrooks – Shahzad

관련 문제