首页 > 代码库 > 算法题之二(从尾到头打印链表)

算法题之二(从尾到头打印链表)

链表节点定义如下:

1 typedef struct ListNode2 {3     int value;4     ListNode *next;5 }TListNode;

众所周知,链表打印时从头到尾很简单,所以我们首先想到的可能是先把链表逆序,然后从头到尾再打印出来即可,但是逆序会破坏链表的结构,对于打印操作来说仅仅是读操作而已,如果破坏了链表结构似乎不和常理,哪么我们是否有更好的解决办法呢?答案是肯定的。

我们知道要解决该问题肯定需要遍历链表,而第一个遍历的节点需要最后一个打印出来,而最后一个遍历的节点需要最先被打印出来,这是一个很典型的“后入先出”,我们能很迅速的想到用栈来解决该问题,我们只需要在遍历时依次将结点压入栈中,再从栈顶依次输出每个结点的值即达到目的。这种思路实现代码如下:

 1 void PrintListReversing(TListNode *head) 2 { 3     stack<TListNode*> nodes; 4  5     TListNode *pnode = head; 6     while (NULL != pnode) 7     { 8         nodes.push(pnode); 9 10         pnode = pnode->next;11     }12 13     while (!nodes.empty())14     {15         pnode = nodes.top();16 17         cout << pnode->value << endl;18 19         nodes.pop();20     }21 }

既然想到用栈来实现,而递归本身就是一个栈结构,因而不难想出用递归的方式来实现,实现代码如下所示:

 1 void PrintListReversing2(TListNode *head) 2 { 3     if (NULL != head) 4     { 5         if (NULL != head->next) 6         { 7             PrintListReversing2(head->next); 8         } 9 10         cout << head->value << endl;11     }12 }

上面的实现代码非常简洁,但是如果链表中结点数很多,可能会导致函数栈溢出,因此实际编码中应该避免使用。