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

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

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

链表删除指定值的节点

第一次再牛客上用ACM模式手撕链表相关的题目,之前再力扣上做链表的题目,链表节点都是定义好了的,突然要自己定义有点不适应,不过还好,刚好多练练。链表节点的定义可以使用结构体,也可以使用类,全看个人喜好,我习惯了力扣上的ListNode,这里就先手撕一个吧。

其实这题的做法不难,比较难的是链表节点的定义以及根据你的定义进行的操作,有一个需要注意的地方是删除操作的时候需要知道前置节点,记得删除节点后要释放指针所指的内存空间,用delete就可以了,我代码里没写纯粹是我忘了...

#include<iostream>
#include<vector>
#include<vector>
#include"stdio.h"

using namespace std;

//定义链表节点,用的结构体
struct ListNode {
    ListNode* next;
    int val;
    ListNode(int a) {
        val = a;
        next = NULL;
    }
};

//查找值为value的链表节点,返回节点指针
ListNode* findNode(ListNode* head, int value) {
    ListNode * cur = head;
    while (cur -> next != NULL) {
        if (cur -> val == value) return cur;
        cur = cur -> next;
    }
    return cur;
}

int main () {
    int n;
    cin >> n;
    n-- ;
    int headVal;
    cin >> headVal;
    int count = 1;
    //定义头结点
    ListNode* head = new ListNode(headVal);
    //按照题目要求构建链表
    while(n--) {
        int a, b;
        cin >> a >> b;
        ListNode * ip = findNode(head, b);
        ListNode * newNode = new ListNode(a);
        ListNode * temp = ip -> next;
        ip -> next = newNode;
        newNode -> next = temp;
        count++;
    }
    //找到删除节点的前置节点与待删除节点
    int del;
    cin >> del;
    ListNode * cur = head;
    
    ListNode* delPre = head;
    ListNode* delNode = head -> next;
    
    while (delNode != NULL) {
        if (delNode -> val == del) break;
        delPre = delPre -> next;
        delNode = delNode -> next;
    }
    delPre -> next = delNode -> next;
    count--;
    //当链表无节点时不输出
    if (count > 0) {
        while (cur != NULL) {
        cout << cur -> val << " ";
        cur = cur -> next;
        }
        cout << endl;
    }
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
转发
投递腾讯云智研发等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务