删除链表中指定值的节点

面试题经常遇到的基础题:删除链表中指定值的节点。

解题思路:

  (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;
}

 

posted on 2016-04-06 16:59  skipping  阅读(3054)  评论(0编辑  收藏  举报

导航