第五十八题(从尾到头输出链表)

58.从尾到头输出链表。

题目:输入一个链表的头结点,从尾到头反过来输出每一个结点的值。

思路:题不难,提供几种思路

1.使用栈的先进后出特性实现,遍历链表元素依次入栈,再出栈就可以达到目的

2.使用数组先暂存顺序遍历的结果,再对数组反向遍历就可以。

3.递归,也就是这里採用的方法。

C++代码:

#include "stdafx.h"
#include<ctime>
#include<iostream>
namespace MS100P_58
{
	void reversePrintList(node* p)
	{
		if (p == NULL)	return;
		reversePrintList(p->next);
		cout << p->data << ‘ ‘;
	}
	void test()
	{
		node *head = createList(20);
		printList(head);
		reversePrintList(head->next);
		cout << endl;
		deleteList(head);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	MS100P_58::test();
	return 0;
}

执行结果:

附測试代码中用到的创建,打印,删除链表的函数

struct node
{
	int data;
	node* next;
};
node* createList(int len)                                                      //创建链表
{
	node* head = new node();
	node* pCurrent = head;
	srand(time(0));
	for (int i = 0; i < len; i++)
	{
		pCurrent->next = new node();
		pCurrent = pCurrent->next;
		pCurrent->data = rand() % 100;

	}
	pCurrent->next = NULL;

	return head;
}
void deleteList(node *p)
{
	node*q;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		delete q;
	}
}
void printList(node * head)                                                                 //打印输出链表内容
{
	node* p = head->next;
	while (NULL != p)
	{
		cout << p->data << ‘ ‘;
		p = p->next;
	}
	cout << endl;
}
时间: 2024-11-05 23:29:41

第五十八题(从尾到头输出链表)的相关文章

【编程题目】从尾到头输出链表(链表)☆

58.从尾到头输出链表(链表).题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值.链表结点定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;}; 我的思路:用一个数组存起来已有的数字,再反过来输出.缺点是数组大小是确定的 链表长度不能超过数组的大小 /* 58.从尾到头输出链表(链表). 题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值.链表结点定义如下: struct ListNode { int m_nKey; ListN

从尾到头输出链表

链表的结构为: struct ListNode { int m_nKey; ListNode* next; }; 从头到尾的输出链表对于大家来说都是比较简单的,但是从尾到头应该怎么做好呢? 其实可以这样想,从头到尾输出链表,并把链表的数据存放到栈中,当遍历到链表尾部的时候,再从栈中输出数据,此时得到的值就是从尾到头输出的值了, 但是在这样的实现中,需要额外去维护一个栈,也是挺麻烦的,这时你可以想一下,栈的实现其实和递归的实现时一样的,那么可不可以不要用栈,而是使用递归实现呢 这样的话更容易理解也

剑指offer第三题 从尾到头打印链表

输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解题思路:先入栈相当于链表逆序再出栈实现链表从尾到头的顺序输出. 1 /** 2 * public class ListNode { 3 * int val; 4 * ListNode next = null; 5 * 6 * ListNode(int val) { 7 * this.val = val; 8 * } 9 * } 10 * 11 */ 12 import java.util.*; 13 public class So

《剑指offer》第五十八题(翻转单词顺序)

// 面试题58(一):翻转单词顺序 // 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. // 为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student. ", // 则输出"student. a am I". #include <iostream> void Reverse(char *pBegin, char *pEnd); char* ReverseSentence(char *pData) {

【leetcode 简单】 第五十八题 计数质数

统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . class Solution: def countPrimes(self, n): """ :type n: int :rtype: int """ isPrime = [1] * max(2, n) isPrime[0],isPrime[1]=False,False x = 2 while x

《剑指offer》第五十八题(左旋转字符串)

// 面试题58(二):左旋转字符串 // 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部. // 请定义一个函数实现字符串左旋转操作的功能.比如输入字符串"abcdefg"和数 // 字2,该函数将返回左旋转2位得到的结果"cdefgab". #include <iostream> #include <string> void Reverse(char *pBegin, char *pEnd); char* LeftR

leecode第五十八题(最后一个单词的长度)

class Solution { public: int lengthOfLastWord(string s) { int res=0; int len=s.size(); if(len==0) return res; int index=len-1; while(s[index]==' ')//应对“a__”情况 index--; for(int i=index;i>=0;i--) { if(s[i]!=' ') res++; else break; } return res; } }; 分析

《剑指offer》第五十八题II:左旋转字符串

// 面试题58(二):左旋转字符串 // 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部. // 请定义一个函数实现字符串左旋转操作的功能.比如输入字符串"abcdefg"和数 // 字2,该函数将返回左旋转2位得到的结果"cdefgab". #include <cstdio> #include "StringUtil.h" #include <string.h> char* LeftRotateS

《剑指offer》第五题(重要!从尾到头打印链表)

文件main.cpp // 从尾到头打印链表 // 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. #include <iostream> #include <stack> #include "List.h" using namespace std; void PrintListReversingly_Iteratively(ListNode* pHead)//解法一:使用栈 { stack<ListNode*> nodes;//定义