逆转单向链表
来源:互联网 发布:短信恢复软件注册码 编辑:程序博客网 时间:2024/05/06 15:01
// Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std ;
typedef struct Node{
int data;
struct Node *next;
}node;
void reverse(Node **head)
{
if((!*head)|| !((*head)->next))
{
return;
}
struct Node *pre,*cur,*nex;
pre = *head;
cur = (*head)->next;
while(cur)
{
nex = cur->next;
cur->next = pre;
pre = cur;
cur = nex;
}
(*head)->next = NULL;//原来头指针(现在的尾指针)的next为NULL
(*head)= pre;//改变头指针
}
Node * reverse1(Node *p,Node *head)
{
if((!p)|| !(p->next))
{
head->next = p;
return p;
}
else
{
Node *temp = reverse1(p->next,head);
temp->next = p;
p->next = NULL;
return p;
}
}
void RecursiveReverse(Node **head)
{
struct Node *first;
struct Node *rest;
if(!(*head))
{
return;
}
first = *head;
rest = first->next;
if(!rest)
{
return;
}
RecursiveReverse(&rest);
first->next->next = first;
first->next = NULL;
*head = rest;
}
Node * G_p= NULL;
void RecursionReverse (Node * p1, Node * p2 )
{
if ( p2 == NULL)
{
G_p= p1;
return ;
}
RecursionReverse( p2, p2->next);
p2->next= p1;
}
void RecursionReverse1 (Node * &p1, Node * p2 )
{
if ( p2 == NULL)
{
return ;
}
if ( p1 == p2)
{
p1= NULL;
}
Node * p3= p1;
p1= p2;
RecursionReverse1( p1, p1->next);
p2->next= p3;
}
void RecursionReverse (Node * p1, Node * p2 , Node *& p)
{
if ( p2 == NULL)
{
p= p1;
return ;
}
RecursionReverse( p2, p2->next, p);
p2->next= p1;
}
void Display( Node *head)
{
while ( head)
{
cout << head->data<<" ";
head= head->next;
}
}
void reverse2(Node * &top)
{
if (top)
{
Node* r = top , *p = r->next ,*s ;
r->next = NULL ;
if (!p)
{
cout <<"only 1 element!/n";
return ;
}
else
{
if ( !p->next )
{
cout <<"2 elements!/n";
p->next = r;
return ;
}
while (p)
{
s= p->next ;
if (!s)
{
p->next= r;
top= p;
return ;
}
p->next= r ;
r= p;
p= s;
}
return ;
}
}
else
{
cout <<"no element!/n";
return ;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
node* head= new node ;
head->data= 0;
node* p= head;
for ( int i= 1; i< 5; ++i)
{
node* pn= new node ;
pn->data= i;
p->next= pn;
p= pn;
}
p->next= NULL;
cout <<"逆转前: ";
Display(head );
cout <<"/n逆转后: ";
//方法一:void reverse(Node **head)
//reverse( & head);//头指针发生改变
//方法二:void RecursionReverse (Node * p1, Node * p2 ) //每二个进行换位:(^,0), 1, 2 ,3...
/*RecursionReverse( NULL, head );
head= G_p ;*/
//方法三:void RecursionReverse1 (Node * &p1, Node * p2 )//第一个参数直接改变头指针head
//RecursionReverse1( head, head );
//方法四:void RecursionReverse (Node * p1, Node * p2 , Node *& p)//第三个参数p只是最后一次调用,为了改变头指针head
//RecursionReverse( NULL, head, head );
//方法五:void RecursiveReverse(Node **head)
//RecursiveReverse(&head);
//方法六:Node * reverse1(Node *p,Node *head)
/*reverse1( head , head );
head= p;*/
//方法七:Node * reverse1(Node *p,Node *head)
reverse2( head);
Display( head );//显示链表
system("pause");
return 0;
}
- 单向链表逆转
- 逆转单向链表
- 单向链表逆转
- 单向链表逆转
- 单向链表逆转(递归)
- 单向链表逆转(非递归)
- c实现逆转单向循环链表
- 【补充】递归实现单向链表逆转
- 总结:单向链表的逆转
- 经典面试题目--逆转单向链表
- 单向链表的创建和逆转(完整程序)
- 10.2-7 O(n)非递归逆转单向链表的n个元素。
- 数据结构与算法-----单向线性链表(逆转和反向打印)
- 逆转链表
- 链表的逆转
- 关于逆转链表
- 实现链表逆转
- 线性链表逆转
- C#中获取路径
- 负载均衡交换机知识
- More effective C++ 今日一贴 - 绝不要把多态应用与数组[3]
- HOJ 2728(POJ 1868) Antiarithmetic?
- top命令
- 逆转单向链表
- xampp
- 在重新装好SAP后···
- 互联网时代 安全最重要
- 写给姚明美丽的情书
- 教你如何成为一名Java初级程序员
- 中国石油天然气股份有限公司2008年半年度报告摘要(业绩公告)
- GCC使用入门
- 网上购物发生纠纷维权难 专家呼吁出台政策