剑指Offer03 逆序输出链表

多写了个逆序链表

 1 /*************************************************************************
 2     > File Name: 03_Pirnt_LinkList.c
 3     > Author: Juntaran
 4     > Mail: [email protected]
 5     > Created Time: 2016年08月24日 星期三 02时04分25秒
 6  ************************************************************************/
 7
 8 #include <stdio.h>
 9 #include <malloc.h>
10
11 // 链表结构体
12 struct ListNode
13 {
14     int val;
15     struct ListNode* next;
16 };
17
18 // 构造链表
19 ListNode* createList()
20 {
21     struct ListNode* head;
22     struct ListNode* p;
23     struct ListNode* q;
24     head = p = (ListNode*)malloc(sizeof(ListNode));
25     head->val = 0;
26     for (int i = 1; i <= 10; ++i)
27     {
28         q = (ListNode*)malloc(sizeof(ListNode));
29         q->val = i;
30         p->next = q;
31         p = q;
32     }
33     p->next = NULL;
34     return head;
35 }
36
37 // 顺序输出链表
38 void PrintList(ListNode* head)
39 {
40     if (head == NULL)
41         return;
42     ListNode* temp = head;
43     printf("PrintList:\n");
44     while (temp != NULL)
45     {
46         printf("%d ", temp->val);
47         temp = temp->next;
48     }
49     printf("\n");
50 }
51
52 // 逆序输出链表
53 void ReversePrintList(ListNode* head)
54 {
55     if (head != NULL)
56     {
57         if (head->next != NULL)
58         {
59             ReversePrintList(head->next);
60         }
61         printf("%d ", head->val);
62     }
63 }
64
65 // 逆序链表
66 ListNode* ReverseList(ListNode* head)
67 {
68     if (head==NULL || head->next==NULL)
69         return head;
70     ListNode* fast = head->next;
71     ListNode* slow = head;
72     slow->next = NULL;
73     ListNode* temp;
74
75     while (fast->next != NULL)
76     {
77         temp = fast->next;
78         fast->next = slow;
79         slow = fast;
80         fast = temp;
81     }
82     fast->next = slow;
83     return fast;
84 }
85
86 int main()
87 {
88     ListNode* test = createList();
89     PrintList(test);
90     printf("ReversePrintList:\n");
91     ReversePrintList(test);
92     printf("\n");
93     test = ReverseList(test);
94     PrintList(test);
95     return  0;
96 }
时间: 2024-10-15 01:51:25

剑指Offer03 逆序输出链表的相关文章

剑指Offer14 逆序链表

1 /************************************************************************* 2 > File Name: 14_ReverseListNode.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 15时47分32秒 6 *********************************

java版的单向链表的逆序输出

将单向链表逆序输出,方法有三种: a.遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组(最简单的做法) b.使用栈来逆序输出 c.直接将链表逆序然后输出(本文采用的方法) 先介绍算法: 1). 若链表为空或只有一个元素,则直接返回: 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继: 3). 重复2),直到q为空 4). 调整链表头和链表尾 示例:以逆序A->B->C->D为例,图示如下 package com.moluo.shujujiegou;

链表逆序输出 ---九度1511

题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 样例输入: 1 2 3 4 5 -1 样例输出: 5 4 3 2 1 解题思路: 方法一:直接用数组存储数据,然后反向输出,不过好像通不过.为什么? 方法二:利用

面试:用 Java 逆序打印链表

昨天的 Java 实现单例模式 中,我们的双重检验锁机制因为指令重排序问题而引入了 volatile 关键字,不少朋友问我,到底为啥要加 volatile 这个关键字呀,而它,到底又有什么神奇的作用呢? 对 volatile 这个关键字,在昨天的讲解中我们简单说了一下:被 volatile 修饰的共享变量,都会具有下面两个属性: 保证不同线程对该变量操作的内存可见性. 禁止指令重排序. 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量. 可见性:一个线

[华为机试练习题]24.删除链表中的反复节点、剩余节点逆序输出

题目 描写叙述: 题目描写叙述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容反复的节点(反复的节点所有删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容反复的节点(反复的节点所有删除).剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]仅仅须要完毕该函数功

单链表逆序或者逆序输出

分为两种情况,一种是只逆序输出,实际上不逆序:另一种是把链表逆序. ********************逆序输出*********************** 1 #include<iostream> 2 #include<stack> 3 #include<assert.h> 4 using namespace std; 5 6 7 typedef struct node{ 8 int data; 9 node * next; 10 }node; 11 12 //

[华为机试练习题]24.删除链表中的重复节点、剩余节点逆序输出

题目 描述: 题目描述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容重复的节点(重复的节点全部删除),剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]只需要完成该函数功能算法,中

如何实现一个高效的单向链表逆序输出?(详解)

需要考虑因素,高效应权衡多方面因素 数据量是否会很大 空间是否有限制 原始链表的结构是否可以更改 时间复杂度是否有限制 一个链表节点需要输出的元素有多个,例如链表中存的是自定义对象,有多个字段 题目. 01. 先学着实现一个简单的Java版的单项链表构建任意长度的任意数值的链表, 头插法,顺序遍历输出链表 package com.szs.list; /** * 单链表 * @author Administrator * */ public class MyLinkedList { public

逆序建立链表

题目描述 输入整数个数N,再输入N个整数,按照这些整数输入的相反顺序建立单链表,并依次遍历输出单链表的数据. 输入 第一行输入整数N;: 第二行依次输入N个整数,逆序建立单链表. 输出 依次输出单链表所存放的数据. 示例输入 10 11 3 5 27 9 12 43 16 84 22 示例输出 22 84 16 43 12 9 27 5 3 11 #include <iostream> #include <malloc.h> using namespace std; struct