单向链表的创建及翻转
2011-04-08 19:45
302 查看
感谢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]; }
相关文章推荐
- C语言单向链表的创建、释放、插入、删除、翻转操作练习
- 单向链表创建存入数组后翻转
- 单向链表的创建、节点删除、链表输出、翻转(写法参考计蒜客数据结构课程)
- 单向链表的创建与遍历(先进先出和先进后出)
- 关于单向链表创建以及一些简单的增删查改功能
- 单向链表的基本操作-创建、插入、删除
- 单向链表->创建节点
- java创建节点和单向链表
- 链表的C++创建及翻转
- 无情链表的创建,,翻转翻转
- 单向链表(1)-创建
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- 单向循环链表的创建及基本操作的实现
- 单向链表翻转问题
- 单向循环链表的创建/插入/删除/输出算法
- 单向链表创建与遍历
- 单向链表的相关操作(创建,遍历,插入,删除,逆置)
- 一个 while 实现 C 翻转单向链表
- 单向链表创建图解
- 线性表之单向链表的创建、插入、删除和清除