剑指offer之反向打印链表值

简介: 剑指offer之反向打印链表值

1 问题

反向打印链表值


2 思考

1) 我们利用栈的思想,新进后出,把链表的每个元素分别入栈之后再打印栈

2)既然上面用到了栈,我们应该就会想到用到递归来实现


3 代码实现

#include <iostream>
#include <stack>
#include <stdlib.h>
using namespace std;
typedef struct node
{
  int value;
  struct node *next;
} Node;
/**
 *把链表的每一个元素遍历出来放进栈,然后利用
 *栈把先进后出的特点,然后打印栈
 */
void reverse_printf(Node *head)
{
  if (head == NULL)
  {
    std::cout << "head is NULL" << std::endl;
    return; 
  }
  Node *p = head;
  stack<Node *> stk;  
  while (p != NULL)
  {
    stk.push(p);
    p = p->next;
  }
  while(!stk.empty())
  {
    Node *node = stk.top();
    std::cout << node->value << std::endl;
    stk.pop();
  }
}
/**
 *既然上面用到了栈,那么我们自然而然就会想到
 *用递归的思想,我们就自己调用自己直到遍历到最后
 *很明显我们递归的条件是最后一个原始的next不能为空
 */
void reverse_printf1(Node *head)
{
  /**这样也行
  if (head == NULL)
  {
    return; 
  }
  reverse_printf1(head->next);
  std::cout << head->value << std::endl;**/
  if (head != NULL)
  {
    reverse_printf1(head->next);
    std::cout << head->value << std::endl;
  }
}
void printf(Node *head)
{
  if (head == NULL)
  {
    std::cout << "head is NULL" << std::endl;
    return; 
  }
  Node *p = head;
  while (p != NULL)
  {
    std::cout << p->value << std::endl;
    p = p->next;
  }
}
int main()
{
  Node *head = NULL;
  Node *node1 = NULL;
  Node *node2 = NULL;
  Node *node3 = NULL;
  head = (struct node*)malloc(sizeof(Node));
  node1 = (struct node*)malloc(sizeof(Node));
  node2 = (struct node*)malloc(sizeof(Node));
  node3 = (struct node*)malloc(sizeof(Node)); 
  if (head == NULL || node1 == NULL || node2 == NULL || node3 == NULL)
  {
    std::cout << "malloc fail" << std::endl;
    return -1;
  }
  head->value = 0;
  head->next = node1;
  node1->value = 1;
  node1->next = node2;
  node2->value = 2;
  node2->next = node3;
  node3->value = 3;
  node3->next = NULL;
  printf(head);
  std::cout << "***************" << std::endl;
  reverse_printf(head);
  std::cout << "***************" << std::endl;
  reverse_printf1(head);
  free(head);
  free(node1);
  free(node2);
  free(node3);
  return 0;
}

4 运行结果

0
1
2
3
***************
3
2
1
0
***************
3
2
1
0
相关文章
|
3月前
反向输出一个链表
【10月更文挑战第2天】反向输出一个链表。
14 2
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
57 0
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
61 5
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
47 4
|
6月前
反向输出一个链表
【7月更文挑战第5天】反向输出一个链表。
23 1
|
8月前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
51 1
|
8月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
8月前
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表
|
8月前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
|
8月前
|
机器学习/深度学习
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点

热门文章

最新文章