假设有一个没有头指针的单链表,一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
作者巧妙地把删除无头单链表节点的问题做了转换,把要删除的节点的下一个节点中的数据部分传递给此节点,然后再删除下一个节点。可见,在不影响效率和复杂度的前提下,我们完全可以不受题目要求的局限,另辟蹊径。
#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; }