题解 | #从单向链表中删除指定值的节点#

从单向链表中删除指定值的节点

https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f

#include <iostream>
#include <utility>
#include <vector>
using namespace std;

struct Node{
    int val;
    Node* next;

    Node(int new_val, Node* ptr=nullptr){
        this->val = new_val;
        this->next = ptr;
    }
};

void showList(Node* head){
    Node* ptr = head;
    while(ptr){
        cout << ptr->val << " ";
        ptr = ptr->next;
    }
    cout << endl;
}

int main() {
    Node* head = nullptr;
    
    int nodeNum, headVal = 0;
    cin >> nodeNum >> headVal;
    
    vector<pair<int, int> > store; 
    for(int i = 0; i < (nodeNum-1); i ++){
        int insertVal, indVal = 0;
        cin>>insertVal>>indVal;
        store.push_back(make_pair(insertVal, indVal));
    }
    int delVal = 0;
    cin>>delVal;
  
	// 链表插入,当前节点A为被插入节点时,创建新节点B,B->next=A->next,A->next = B
    head = new Node(headVal);
    int count = 0;
    Node* ptr = head;
    while(count < nodeNum-1){

        int insertVal = store[count].first;
        int indVal = store[count].second;

        int nowVal = ptr->val;
        if(nowVal == indVal){
            Node* newNode = new Node(insertVal);
            newNode->next = ptr->next;
            ptr->next = newNode;

            count++;
            ptr = head;
            // continue;
        }else{
            ptr = ptr->next;
        }
    }
    // showList(head);
  
	/* 删除节点,
	 1. 当删除节点为表首节点head:
	   head=ptr->next,
	   新建指针del指向ptr,重新设置ptr=head, 之后删除del
	   
	 2. 删除节点不是表首节点,则判断当前节点的下一个节点是不是待删除节点
	 
	 3. 最后,遍历到下一个节点为nullptr,此时说明到表尾节点了。
	 
	 结束删除
	 */
  
    ptr = head;
    while(ptr){
        int nowVal = ptr->val;

        if(ptr == head && nowVal == delVal){
            head = ptr->next;
            Node* del = ptr;
            ptr = head;
            del->next = nullptr;
            delete del;
        }else if( ptr->next ){
            Node* next = ptr->next;
            int nextVal = next->val;

            if(nextVal == delVal){
                ptr->next = next->next;
                next->next = nullptr;
                ptr = ptr->next;
                delete next;
            }else{
                ptr = ptr->next;
            }
        }else{
            break;
        }
    }
    showList(head);
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

vegetable_more_exercise:1-1.5万,没错啊,最少是1人民币,在区间内
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务