感谢XX公司的笔试啊,让我总算下定决心彻底把这个似乎很简单的问题想一想了,发觉之前自己的理解真是差强人意! 下面的链表翻转是通过重新创建一个新链表来实现的,空间复杂度过于不理想... #include <iostream> using namespace std; struct Node { int data; Node *next; }*head; void AddNode(int value); void Swap(Node *&head); int main() { head=NULL; AddNode(1); AddNode(2); AddNode(3); AddNode(4); AddNode(5); AddNode(6); Node *p=head; while(p) { cout<<p->data<<" "; p=p->next; } Swap(head); p=head; cout<<endl; while(p) { cout<<p->data<<" "; p=p->next; } system("pause"); return 0; } void AddNode(int value) { Node *p=new Node(); p->data=value; p->next=NULL; if(!head) { head=p; } else { Node *q=head; while(q->next) q=q->next; q->next=p; } } void Swap(Node *&head) { Node *qOld=head; Node *pHead=new Node(); if(!head) { cout<<"链表为空!"<<endl; return ; } pHead->data=head->data; pHead->next=NULL; while(qOld->next) { Node *pNew=new Node(); *pNew = *(qOld->next); pNew->next=pHead; pHead=pNew; qOld=qOld->next; } head=pHead; } 改进:使用传说中的三指针法~ void Swap(Node *&head) { if(!head) { cout<<"链表为空!"<<endl; return ; } Node *a[3]; a[0]=a[1]=NULL; a[2]=head; while(a[2]->next) { a[0]=a[1]; a[1]=a[2]; a[2]=a[2]->next; a[1]->next=a[0]; } a[2]->next=a[1]; head=a[2]; }