编程之美3.4 从无头单链表中删除节点

来源:互联网 发布:js鼠标移入事件 编辑:程序博客网 时间:2024/04/30 13:30

假设有一个没有头指针的单链表,一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除。

作者巧妙地把删除无头单链表节点的问题做了转换,把要删除的节点的下一个节点中的数据部分传递给此节点,然后再删除下一个节点。可见,在不影响效率和复杂度的前提下,我们完全可以不受题目要求的局限,另辟蹊径。

#include <iostream>using namespace std;struct Node{int data;Node* next;};void insertope(Node* &head,int a){//插入一个元素Node *newp = new Node();newp->data = a;newp->next = NULL;Node *p = head;while(p->next){p = p->next;}p->next = newp;}void deleteope(Node* &head){//删除头元素Node *p = head->next;head->data = p->data;head->next = p->next;delete p;}void print(Node *head){//打印整个链表while(head){cout<<head->data<<" ";head = head->next;}cout<<endl;}void inverse(Node *&head){//将单链表中的元素顺序反转过来Node *p = head;Node *q = head->next;p->next = NULL;Node * temp;while(q){temp = q->next;q->next=p;p=q;q=temp;}head = p;}int main(){Node * head = new Node();head->data = 1;head->next = NULL;insertope(head,2);insertope(head,3);print(head);inverse(head);print(head);return 0;}