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