2017-11-25 1 views
0

이것은 지금까지 가지고 있지만 테스트 파일에서 작동하지 않습니다. 기본적으로 다른 if(cnode == preposition)연결된 목록에서 노드를 삭제하는 방법은 무엇입니까?

void LinkedList::Delete(Node *PrePosition) { 

    Node *cnode = head; 
    Node *pnode = NULL; 
    while (cnode != NULL) { 
     if (cnode->value != NULL) { 
      if (pnode == NULL) { 
       //if there is not previous node 
       head = cnode->next; 
      } 
      else if(cnode == PrePosition){ 
       //if there is previous node 
       cout << endl << "Deleting: " << cnode << endl; 
       pnode->next = cnode->next; 
      } 
     } 
     else { 
      //dont delete 
      pnode = cnode; 
     } 
     cnode = cnode->next; 

    } 

} 

답변

3

1으로 건너 뜁니다 : 이전 노드에서 포인터를 가지고 당신이

2 삭제할 한 후 다음 중 하나를 가리 님의 이전 노드에서 포인터를 삭제 현재 노드

3 : (그것은 이중 연결리스트 인 경우) 현재 노드에 다음 노드에서 포인터를 삭제하려면 단일 연결 목록에서 삭제의

+1

덧글로 덧글 geeksforgeeks.com –

+0

에 대한 추가 정보가 있습니다. 덧글로 추가하지 말고 대답으로 추가 정보 (링크 포함)를 편집하는 것이 더 좋습니다. – PiedPiper

+0

@PiedPiper, 죄송합니다, 매우 신겨졌습니다. 그것을 염두에 두어야합니다 :) –

1

3 건 :

  1. codementor에서 삭제할 마지막 노드

    void delete_last() 
    { 
        node *current = new node; 
        node *previous = new node; 
        current=head; 
        while(current->next != NULL) 
        { 
         previous = current; 
         current = current->next; 
        } 
        tail = previous; // if you have a Node* tail member in your LinkedList 
        previous->next = NULL; 
        delete current; 
    } 
    
  2. 특정 위치에서 삭제

    (귀하의 경우)

    void LinkedList::delete_position(int pos) 
    { 
        node *current=new node; 
        node *previous=new node; 
        current=head; 
        for(int i=1; i < pos; i++) //or i = 0; i < pos-1 
        { 
         previous=current; 
         current=current->next; 
        } 
        previous->next=current->next; 
    } 
    

    를 ^^ 첫 번째 노드

    void delete_first() 
    { 
        node *temp=new node; 
        temp=head; 
        head=head->next; 
        delete temp; 
    } 
    
  3. 삭제^

그러나 함수 서명은 의도 경우 delete_node(Node* nodeToDelete) [전치사가이 경우에 좋은 이름이 아닙니다] 당신은 우리가 delete_position을 (수정할 수있는 목록에서 해당 위치를 모른 채 함수에 전달 노드를 삭제하려는 경우)과 같이 : 그것은 당신이 언급 한 줄을 건너 뛰는 않다면 cnode 그것에 null 이외의 값을 가질 때

void LinkedList::delete_node(Node* nodeToDelete) 
{ 
    if (head == nodeToDelete){ 
     head = nodeToDelete->next; 
     return 
    }//else: 
    node *current=new node; 
    node *previous=new node; 
    current=head; 
    while(current != nodeToDelete) 
    { 
     previous = current; 
     current = current->next 
    } 
    previous->next = current->next; 
} 

는 또한 원래의 코드에서, pnode는 항상 null입니다.

+0

이전 위치에 대한 포인터가 이미있는 경우 왜 목록을 반복하여 찾을 수 있습니까? – user4581301

+0

@ElfenDew 지금 당신보다 더 많은 표를 얻었 기 때문에 기분이 좋지 않습니다. –

관련 문제