>source

키가 주어진 링크 된 목록에서 노드를 삭제하는 코드를 작성했습니다. 그러나 여기에서 첫 번째 노드를 삭제 한 다음 내 목록을 탐색하려고하면 이전에 존재했던 첫 번째 노드가 계속 표시됩니다. 누군가 내가 여기서 뭘 잘못하고 있는지 말해 줄 수 있습니까? 클래스 이름으로 시작하는 전체 코드

public class LinkedList {
    //removing Node nested class


    public void buildList1() {
        head=new Node(1);
        head.next=new Node(3);
        head.next.next=new Node(5);
        head.next.next.next=new Node(7);

    }
    public boolean removeNode(Node head,int x) {
        //1 3 5 7---to delete 5
        Node q=head;//q
    //  Node p=head.next;//p
        Node prev=null;
        if(q!=null && q.data==x) {
            head=q.next;
            //q=null;
            System.out.println("next to head" + head.data);
            return true;
        }
        while(q!=null && q.data!=x) {
            prev=q;
            q=q.next;
        }
        if(q==null)
            return false;
        prev.next=q.next;
        return true;
    }
    public void printList() 
    { 
        Node tnode = head; 
        while (tnode != null) 
        { 
            System.out.print(tnode.data+" "); 
            tnode = tnode.next; 
        } 
    } 
    public static void main(String args[]) {
        LinkedList list=new LinkedList();
        list.buildList1();

        list.printList();
        System.out.println(list.removeNode(list.head, 1));
        list.printList();
    }
}

  • 답변 # 1

    @JD D는 좋은 답변을 얻었지만 나는 removeNode 를 할 것입니다  더 쉬운 방법입니다.

    public boolean removeNode(int x) {
        tempNode = this.head;
        prevNode = null;
        if (this.head != null && this.head.data == x) {
            this.head = this.head.next;
            return true;
        }
        while (tempNode != null) {
            if (tempNode.data == x) {
                prevNode.next = tempNode.next;
                return true;
            }
            prevNode = tempNode;
            tempNode = tempNode.next;
        }
        return false;
    }
    
    

  • 답변 # 2

    헤드를 인스턴스 변수로 추가하고 removeNode 함수에서 해당 매개 변수를 제거하십시오. this 를 사용하여 메소드에서이 변수를 참조 할 수 있어야합니다.  키워드.

    이와 같은 일 (추천하지는 않지만 아이디어를 얻길 바랍니다) :

    public class LinkedList {
        //removing Node nested class
        private Node head;
        public void buildList1() {
            this.head=new Node(1);
            this.head.next=new Node(3);
            this.head.next.next=new Node(5);
            this.head.next.next.next=new Node(7);
    
        }
        public boolean removeNode(int x) {
            Node q=this.head;
            Node prev=null;
            if(q!=null && q.data==x) {
                this.head=q.next;
                return true;
            }
            while(q!=null && q.data!=x) {
                prev=q;
                q=q.next;
            }
            if(q==null)
                return false;
            prev.next=q.next;
            return true;
        }
        public void printList() 
        { 
            Node tnode = this.head; 
            while (tnode != null) 
            { 
                System.out.print(tnode.data+" "); 
                tnode = tnode.next; 
            } 
        } 
        public static void main(String args[]) {
            LinkedList list=new LinkedList();
            list.buildList1();
            list.printList();
            System.out.println(list.removeNode(1));
            list.printList();
        }
    }
    
    

  • 답변 # 3

    public static void main(String args[]) {
        LinkedList list=new LinkedList();
        list.buildList1();
        list.printList();
        list.remove(2);
        list.printList();
    }
    
    

    LinkedList에는 메소드 라이브러리가 있으며, 하나는 remove (int index)입니다. 그림과 같이 사용하십시오.

  • 답변 # 4

    만약 당신의 인생은 더 단순 할 것입니다  node는 첫 번째 노드가 아니며 첫 번째 실제 노드는 head 입니다.  당신의 (고정 된) next .

    따라서 첫 번째 (실제) 노드가 삭제 된 경우를 처리하기 위해 특별한 코드가 필요하지 않습니다.

  • 답변 # 5

    만든 목록을 직접 사용해보십시오. 가능한 두 가지 솔루션. 먼저 : 생성 된 목록 사용

    head
    
    

    두 번째 : 목록 자체를 전달하십시오

    if (q != null && q.data == x) {
            this.head = q.next;//use this to refer the list you created
            // q=null;
            System.out.println("next to head" + head.data);
            return true;
        }
    
    
    public boolean removeNode(LinkedList list, int x) { // 1 3 5 7---to delete 5 Node q = list.head;// q } //Call it like this System.out.println(list.removeNode(list, 1));

  • 이전 JavaScript를 사용하여 기본 항목 목록 항목 RadListView를 업데이트하는 방법
  • 다음 c - 정적 라이브러리를 통해 링크되면 잘 작동하지 않지만 프로그램에서 복사하면 작동합니다