面试题经常遇到的基础题:删除链表中指定值的节点。
解题思路:
(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;
}