链表逆序
来源:互联网 发布:js字符串contains 编辑:程序博客网 时间:2024/06/06 14:05
给定一单链表的表头指针和指向其中一个节点的指针,要求以该指针为头将原链表逆序排列,例如:
1. N1->N2->N3->N4->N5->NULL
2. N1->N2->N3->N4->N5->NULL
3. N1->N2->N3->N4->N5->NULL
不允许额外分配存储空间,不允许递归,可以使用临时变量。
很容易想到的做法是先将整个链表逆序,然后将尾节点连接到头节点,然后再从pSTART后面断开。我是把它分成两个部分,即包括pSTART的前面部分和不包括pSTART的后面部分。当pSTART和pHEAD重合时,前面一部分只有一个节点;当pSTART是链表的尾节点的时候,后面一部分是空链表。分别逆序完了以后,再连接起来。
前面有道题说了,使用pHead和两个临时变量就可以将一个链表逆序,我这里没有使用phead,所以用到了三个临时变量。里面用的临时变量比较多,思路不太清晰。
#i nclude <iostream>
#i nclude <string>
using namespace std;
struct Node
{
char name[3];
Node * next;
Node( const char* p)
{
strcpy(name,p);
next =0;
}
};
//将某个链表逆序
void ReserseList(Node *& pHead, Node *& pTail)
{
Node *p1=pHead;
if(p1==0) //首指针为空,表示空链表
{
pTail =0;
return;
}
Node *p2=p1->next;
if(p2==0) //首指针的下一个节点为空,表示只有一个节点
{
pTail =0;
return;
}
//至少有两个不为空的节点
Node *p3=0;
while(p2!=0)
{
p3 =p2->next;
p2 ->next=p1;
p1 =p2;
p2 =p3;
p3 =0;
}
pHead ->next=0; //将首节点的next置为0,否则会形成循环链表
pTail=pHead;
pHead =p1;
}
//分成两个链表,然后再合并
Node * Reserse(Node * pHEAD, Node * pSTART)
{
Node *ptmp1=pHEAD, *ptmp2=pSTART;
//将两表拆开
Node *pHead2=pSTART->next;
pSTART ->next=0;
ReserseList(ptmp1,ptmp2); //逆序前面一部分
Node *ptmp3=0;
ReserseList(pHead2,ptmp3); //逆序后面一部分
//合并
if(ptmp2==0)//前面一部分只有一个节点
ptmp1->next=pHead2;
else//前面一部分有一个以上的节点
ptmp2->next=pHead2;
return ptmp1;
}
void output(Node * tmp)
{
while(tmp!=0)
{
cout <<tmp->name<<"->";
tmp =tmp->next;
}
cout <<"NULL"<<endl;
}
int main()
{
Node * pHEAD=new Node("N1");
Node * p2=new Node("N2");
Node * p3=new Node("N3");
Node * p4=new Node("N4");
Node * p5=new Node("N5");
pHEAD ->next=p2;
p2 ->next=p3;
p3 ->next=p4;
p4 ->next=p5;
output(pHEAD);
Node * result=Reserse(pHEAD,p4);
output(result);
getchar();
return 0;
}
#i nclude <string>
using namespace std;
struct Node
{
};
//将某个链表逆序
void ReserseList(Node *& pHead, Node *& pTail)
{
{
{
Node *p3=0;
pTail=pHead;
}
//分成两个链表,然后再合并
Node * Reserse(Node * pHEAD, Node * pSTART)
{
Node *pHead2=pSTART->next;
Node *ptmp3=0;
if(ptmp2==0)//前面一部分只有一个节点
ptmp1->next=pHead2;
ptmp2->next=pHead2;
}
void output(Node * tmp)
{
}
int main()
{
}
0 0
- 链表的逆序
- 链表逆序
- 链表逆序
- 链表逆序小结
- 逆序链表
- 链表逆序 :华硕
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 实现链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- 链表逆序
- java之顺时钟打印矩阵
- 如何知道一个server 的ip
- java项目中使用dubbo实战
- bat命令
- iOS UITableView的Section Footer添加按钮
- 链表逆序
- 文件路径或者保存模板出现非法字符判断
- 如何获得git-repo或者android repo
- Android面试、开发之高手 编码规范与细节
- PHP单例模式例程
- Android三种设备适配
- cocos2dx Socket (一)
- Java 类型信息 instanceof、isInstance和isAssignabelFrom
- 学习笔记)蓝牙Bluetooth4.0 传统蓝牙与低功耗蓝牙