单链表图 

帮助理解: 

1.A->next其实就是存放B节点的首地址。

A->next = B(B表示地址)

A->next->value = B->value

A->next->next = B->next

2. 链表尾部的C节点的C->next等于null,说明已经到了结尾了。

例子

    while(A->next != nullptr){
        A =  A->next;
    }

注释:A->next其实代表B的起始地址,如果A->next不等于NULL,则将A指向B的地址,等于A向后移动到B的地址,这时候其实结点A已经到了结点B的位置,如果B的后边没有结点了,说明A->next等于NULL,退出循环.

// 6:从尾到头打印链表
// 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。#include<iostream>
#include<stack>
using namespace std;struct ListNode{int m_nValue;ListNode * m_pNext;
};//建立带头结点的空单链表
void InitList(ListNode **L) {*L = (ListNode*)malloc(sizeof(ListNode));//建立头结点(*L)->m_pNext = NULL;//建立空的单链表
}//使用栈:先进后出;把每个遍历的节点以此从栈顶到栈底放入,遍历完链表后,从栈顶逐个输出,因栈顶先出栈,栈底后出栈.
void print_stack(ListNode * pHead){stack<ListNode *> nodes;ListNode * pNode = pHead;while (pNode != nullptr){nodes.push(pNode);pNode = pNode->m_pNext;}while (!nodes.empty()){pNode = nodes.top();printf("%d\n", pNode->m_nValue);nodes.pop();}
}//使用递归(层数太多可栈溢出)
void print_recurve(ListNode * pHead){if (pHead != nullptr){if (pHead->m_pNext != nullptr){print_recurve(pHead->m_pNext);}printf("%d\n", pHead->m_nValue);}
}//带头结点的单链表添加
void add_head(ListNode * pHead,int value){ListNode * pNew = new ListNode();pNew->m_nValue = value;pNew->m_pNext = nullptr;ListNode * pNode = pHead;while (pNode->m_pNext != nullptr){pNode = pNode->m_pNext;}pNode->m_pNext = pNew;
}//不带头结点的单链表添加
void add_no_head(ListNode ** pHead, int value){ListNode * pNew = new ListNode();pNew->m_nValue = value;pNew->m_pNext = nullptr;if (*pHead == nullptr){*pHead = pNew;}else{ListNode * pNode = *pHead;while (pNode->m_pNext != nullptr){pNode = pNode->m_pNext;}pNode->m_pNext = pNew;}
}#if 1
int main(){ListNode * L;printf("line = %d\n",__LINE__);InitList(&L);add_head(L, 1);add_head(L, 2);add_head(L, 3);add_head(L, 4);add_head(L, 5);add_head(L, 6);//print_stack(L->m_pNext);print_recurve(L->m_pNext);return 0;
}#else
int main(){ListNode * L=nullptr;printf("line = %d\n",__LINE__);add_no_head(&L, 1);add_no_head(&L, 2);add_no_head(&L, 3);add_no_head(&L, 4);add_no_head(&L, 5);//print_stack(L);print_recurve(L);return 0;
}#endif
//简化版
#include<iostream>
#include<stack>
using namespace std;struct ListNode{int value;ListNode * next;
};void print_stack(ListNode * pHead){stack<ListNode *> nodes;ListNode * pNode = pHead;while (pNode != nullptr){nodes.push(pNode);pNode = pNode->next;}while (!nodes.empty()){pNode = nodes.top();printf("%d\n", pNode->value);nodes.pop();}
}void print_recurve(ListNode * pHead){if (pHead != nullptr){if (pHead->next != nullptr){print_recurve(pHead->next);}printf("%d\n", pHead->value);}
}void insert_data(ListNode ** pHead, int value){ListNode * pNew = new ListNode();pNew->value = value;pNew->next = nullptr;if (*pHead == nullptr){*pHead = pNew;} else {ListNode * pNode = *pHead;while (pNode->next != nullptr)pNode = pNode->next;pNode->next = pNew;}
}int main(){ListNode * L=nullptr;printf("line = %d\n",__LINE__);insert_data(&L, 1);insert_data(&L, 2);insert_data(&L, 3);insert_data(&L, 4);insert_data(&L, 5);//print_stack(L);print_recurve(L);return 0;
}
//拆分理解
#include<iostream>
using namespace std;struct ListNode{int value;ListNode *next;
};int main(){ListNode *L = nullptr;//1.创建第一个节点ListNode *pNew = new ListNode();pNew->value = 12;pNew->next = nullptr;if(L == nullptr)L = pNew;ListNode *pNode = L;printf("xxx---line = %d, L->value = %d\n",__LINE__,L->value);printf("xxx---line = %d, pNode->value = %d\n",__LINE__,pNode->value);printf("xxx---line = %d, pNode = %#x, pNode->next = %#x, L = %#x,  L->next = %#x\n\n",__LINE__,pNode,pNode->next,L,L->next);//2.创建第二个节点pNew = new ListNode();pNew->value = 15;pNew->next = nullptr;while(pNode->next != nullptr)pNode = pNode->next;printf("xxx---line = %d, pNode = %#x, pNode->next = %#x, L = %#x,  L->next = %#x\n",__LINE__,pNode,pNode->next,L,L->next);pNode->next = pNew;//L->next = pNew;printf("xxx---line = %d, pNode = %#x, pNode->next = %#x, L = %#x,  L->next = %#x\n",__LINE__,pNode,pNode->next,L,L->next);printf("xxx---line = %d, pNode->value = %d, pNode->next->value = %d, pNode->next->next = %#x\n",__LINE__,pNode->value,pNode->next->value,pNode->next->next);//3.创建第三个节点pNew = new ListNode();pNew->value = 16;pNew->next = nullptr;while(pNode->next != nullptr){printf("xxx---line = %d, pNode = %#x, pNode->next = %#x, L = %#x,  L->next = %#x\n",__LINE__,pNode,pNode->next,L,L->next);pNode = pNode->next;printf("xxx---line = %d, pNode = %#x, pNode->next = %#x, L = %#x,  L->next = %#x\n",__LINE__,pNode,pNode->next,L,L->next);}printf("xxx---line = %d, pNode = %#x, pNode->next = %#x, L = %#x,  L->next = %#x\n",__LINE__,pNode,pNode->next,L,L->next);pNode->next = pNew;//L->next = pNew;printf("xxx---line = %d, pNode = %#x, pNode->next = %#x, L = %#x,  L->next = %#x\n",__LINE__,pNode,pNode->next,L,L->next);return 0;
}

从尾到头打印链表(六)相关推荐

  1. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

  2. 剑指offer:面试题06. 从尾到头打印链表

    题目:从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 & ...

  3. 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java

    <LeetCode力扣练习>剑指 Offer 06. 从尾到头打印链表 Java 一.资源 题目: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入: ...

  4. java从尾到头打印链表数据_Java编程实现从尾到头打印链表代码实例

    问题描述:输入一个链表的头结点,从尾巴到头反过来打印出每个结点的值. 首先定义链表结点 public class ListNode { int val; ListNode next = null; L ...

  5. JAVA实现从尾到头打印链表(《剑指offer》)

    最近在刷<剑指offer>里的编程题,但是网上关于<剑指offer>的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用java写了一些题目的解答代码 ...

  6. 【剑指Offer】从尾到头打印链表

    剑指Offer 从尾到头打印链表 题目描述 解法1 实现代码 一点补充 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解法1 这道题主要思路是while循环从头遍历整个列 ...

  7. 剑指Offer - 九度1511 - 从尾到头打印链表

    剑指Offer - 九度1511 - 从尾到头打印链表2013-11-29 21:08 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案 ...

  8. LeetCode-剑指 Offer 06. 从尾到头打印链表

    剑指 Offer 06. 从尾到头打印链表 思路一:翻转 1:用vector存从头到尾的每个节点值 2:返回时候用reverse翻转一下 时间复杂度:O(n) 空间复杂度:O(n) /*** Defi ...

  9. 剑指offer06.从尾到头打印链表

    剑指offer06.从尾到头打印链表 1. 改变链表结构的解法 2.可以使用栈,递归,或者直接反向输出数组 提示: 若是面试遇到此题,最好先向面试官确认是否可以改变链表的结构, 1. 改变链表结构的解 ...

最新文章

  1. 如何写一篇好的技术博客
  2. iOS--优秀博客记录
  3. javascript:void(0)和onclick=fn(this)
  4. python冒泡排序算法时间复杂度为nlogn_Python版算法专题-1、冒泡排序
  5. 集合-2(Set(HashSet、TreeSet、LinkedHashSet)、List(ArrayList、LinkedList、Vector)、Map(HashMap、TreeMap...))
  6. java 多线程不安全_多线程并发为什么不安全
  7. 【解题报告】Leecode 384. 打乱数组——Leecode每日一题系列
  8. 多个线程“打架抢夺”同一个资源,该如何让它们安分?
  9. 整数实例hdu2041(超级楼梯)
  10. 遗传算法应用于随机森林的调参过程
  11. python 表格处理项目该如何分工_python 处理 Excel 表格
  12. PLC工程师求职面试问题有哪些?
  13. 菜鸟实战UML——包图
  14. 五大通信设备厂商:华为存隐忧,中兴已掉队
  15. 【UI自动化设计模式】超越 Page Objects:使用Serenity和ScreenplayPattern实现新一代的自动化测试
  16. IIR滤波器和FIR滤波器的区别与联系
  17. Uboot中start.S源码的指令级的详尽解析
  18. r语言归一化_生物信息学之RMA(Robust Multi-Array Average)算法的归一化和最终计算过程...
  19. 2018.2.1号 第一次在公司闹事
  20. UE4 3DUI显示与交互案例

热门文章

  1. try,catch,finally
  2. VMvare虚拟机如何删除安装的ubuntu操作系统
  3. 把你的旧笔记本变成 Chromebook
  4. 使用百度地图实现基本的地图显示与定位功能
  5. ATA/SATA/SCSI/SAS/FC总线简介
  6. 想打造一款成功的移动应用?你最需要关注性能指标!
  7. 通过servlet来实现对Mysql进行连接、插入、修改、删除操作
  8. 数据分析-R语言资料整理
  9. java判断integer是否为空_java安全编码指南之:表达式规则
  10. cwntos使用不了php,centos系统不能使用yum命令怎么解决