您的位置:首页 > 其它

从尾到头打印一个链表

2016-05-02 11:58 513 查看
这样的链表问题时不时的出现,你有没有特定的方法去处理呢:以下给出你可能用到的算法:

第一种:改变链表的结构

思想:

1.从尾到头打印链表,那就逆置链表呗

2.打印逆置后的链表;

这个简单,直接上代码:

void PrintListRevers(ListNode* pHead)
{
//1.链表逆置
ListNode* newHead = NULL;
ListNode* cur = pHead;
while (cur)
{
ListNode* tmp = cur;
cur = cur->m_pNext;
tmp->m_pNext = newHead;
newHead = tmp;
}

//2.打印逆置链表
ListNode* tmp = newHead;
while (tmp)
{
cout << tmp->m_nValue << " ";
}
cout << endl;
}
很简单,但是,很不辛的改变了链表原来的结构 这是一种只做读操作不应该出现的,所以,有下边的算法;

方法二:借用栈

思想:

1.由于是从尾部开始打印,如果我们是从头开始遍历,那么先遍历的后打印,这正好的栈的特点。

2.遍历完了之后,所有节点入栈,之后出栈打印。

于是,下边简单的代码又出来了:

void PrintListRevers(ListNode* pHead)
{
std::stack<ListNode*> nodes;

ListNode* pNode = pHead;
while(pNode != NULL)
{
nodes.push(pNode);
pNode = pNode->m_pNext;
}

while(!nodes.empty())
{
pNode = nodes.top();
printf("%d\t", pNode->m_nValue);
nodes.pop();
}
}
方法三:递归

思想:

1.递归就是用栈的思想,既然能想到栈,递归也就想到了

代码:

void PrintListRevers(ListNode* pHead)
{
if(pHead != NULL)
{
if (pHead->m_pNext != NULL)
{
PrintListRevers(pHead->m_pNext);
}

//printf很好控制打印格式
printf("%d\t", pHead->m_nValue);
}
}
但是,递归的缺点很明显,如果连边过长,就会造成栈溢出等问题,谨慎使用!

赐教.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: