删除链表中指定值的节点
面试题经常遇到的基础题:删除链表中指定值的节点。
解题思路:
(1) 新建单向链表;
(2) 删除链表中的指定值:
void deleteNum(Node* head, int data);
解题思路:
步骤一: 排除特殊情况:头结点值等于需要删除值data,则先直接删除头部的节点;
步骤二:
使用快慢指针p, q;
if p->val == data
q->next = p->next;
删除p节点
p = q->next;
else
q = p->next;
p = q->next;
#include <iostream> using namespace std; // 定义节点 struct Node{ int val; Node* next; Node(){ // 初始化节点 val = -1; next = NULL; } }; // 删除指定值的节点 Node* deleteNum(Node* head, int data){ // 排除链表头指定值的情况 while(head!=NULL && head->val==data){ Node* temp = head; head = head->next; delete temp; } Node* p ,* q; // p:较快地指针, q:较慢指针 p = q = head; while(p!=NULL){ if(p->val==data){ // 第一个p肯定不会是data q->next = p->next; delete p; p = q->next; }else{ q = p; p = p->next; } } return head; } int main() { int N, num; cin >> N; // 头结点 Node head; cin >> num; head.val = num; Node *p = &head; for(int i=1;i<N;i++){ cin >> num; Node* temp = new Node(); // 新建节点 temp->val = num; p->next = temp; p = temp; } // 删除指定值的val int data; cin >> data; Node* result = deleteNum(&head, data); // 输出 while(result!=NULL){ cout << result->val << " "; result = result->next; }cout << endl; return 0; }