html无序链表,倒叙输出链表的代码实现(四种方法)--转自博客园

今天面试,被考到倒叙输出链表的方法,我当时用的数组和栈实现的,代码写的不好,回来后网上查资料总结如下,供参考:

四种方式实现倒序输出链表

方法一:借用栈倒序输出链表

方法二:先翻转链表,再顺序输出

方法三:递归实现,好方法

方法四:用数组实现

方法一:借用栈倒序输出链表

因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈

方法二:先翻转链表,再按顺序打印(主要是想自己实现单链表的翻转,这种实现方式破坏了链表的结构,当然再翻转一下就还原了)

翻转链表的步骤:

1:将当前节点的next节点指向他以前的前一个节点

2:当前节点下移一位

3:如果是最后一个节点,就把它的next节点指向它以前的前一个节点,并推出循环

方法三:用递归实现

很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理

正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。

方法四:借用数组实现

跟用栈实现的方式差不多,空间复杂度都是O(n)。

#include

#include

#include

using namespace std;

class OutFromEnd

{

public:

typedef struct node1

{

int data;

node1* next;

node1(int d):data(d),next(NULL){}

} node;

OutFromEnd()

{

head=cur=new node(-1);

}

void add(int data)

{

node* tmp=new node(data);

cur->next=tmp;

cur=tmp;

}

//借用栈倒序输出链表

//因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈

void stackMethod()

{

if(NULL==head || NULL==head->next)

{

return;

}

node* tmp=head->next;

stack s;

while(tmp!=NULL)

{

s.push(tmp->data);

tmp=tmp->next;

}

while(!s.empty())

{

cout<

s.pop();

}

}

void reverse()

{

if(NULL==head || NULL==head->next)

{

return;

}

cur=head->next;

node* prev=NULL;

node* pcur=head->next;

node* next;

while(pcur!=NULL)

{

if(pcur->next==NULL)

{

pcur->next=prev;

break;

}

next=pcur->next;

pcur->next=prev;

prev=pcur;

pcur=next;

}

head->next=pcur;

node* tmp=head->next;

while(tmp!=NULL)

{

cout<data<

tmp=tmp->next;

}

}

void print3()

{

recursion(head->next);

}

//用递归实现

//很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理

//正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。。。

void recursion(node* head)

{

if(NULL==head)

{

return;

}

if(head->next!=NULL)

{

recursion(head->next);

}

//如果把这句放在第二个if前面,那就是从头到尾输出链表,曾经的你或许是用while或者用for循环输出链表,现在你又多了一种方式

cout<data<

}

//借用数组实现

void print4()

{

node* tmp=head->next;

int len=0;

while(tmp!=NULL)

{

++len;

tmp=tmp->next;

}

tmp=head->next;

int* A=new int[len] ;

for(int i=len-1;i>=0;i--)

{

A[i]=tmp->data;

tmp=tmp->next;

}

for(int i=0;i

{

cout<

}

delete [] A;

}

private :

node *head,*cur;

};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值