题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
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;
}