这个题目搞了一段时间,因为解法好多,比如:是用递归法呢还是循环呢,要不要使用栈呢等等.. 所以,每一种想法都写一下吧,还有一点点的小细节什么的。
这个题目就不用解释了吧,举个例子:输入1→2→3→4→5,输出5→4→3→2→1。
方法一:栈+循环
具体的思路:输入一个链表1(特点:先进先出) → 建一个栈(特点:先前后出)和一个链表2 → 把链表一的数据高进栈 → 把栈里的东西倒进链表2 → 结束!!(不明白看代码:注释很详细)
代码实现:
using System.Collections.Generic;
/*
public class ListNode
{
public int val;
public ListNode next;
public ListNode (int x)
{
val = x;
}
}*/
class Solution
{
// 返回从尾到头的列表值序列
//首先输入一个名为printListFromTailToHead的链表;List<int>为链表类型;ListNode listNode分别为指针和数据
public List<int> printListFromTailToHead(ListNode listNode)
{
// write code here
//定义一个名为stack的栈
Stack<int> stack = new Stack<int>();
//定义一个名为list的链表,即为最后输出的那个表
List<int> list=new List<int>();
//定义head指针
ListNode head=listNode;
//当输入的链表数据不为空时,执行进栈操作
while(head!=null)
{
stack.Push(head.val);
head=head.next;
}
//当栈的长度大于0时,出栈;出栈后的数据添加到名为list的链表
while(stack.Count>0)
{
int item=stack.Pop();
list.Add(item);
}
return list;
}
}
方法二:链表+循环
具体的思路:使用两个链表,第一个正序输入,第二个倒着输入。
代码实现:
using System.Collections.Generic;
/*
public class ListNode
{
public int val;
public ListNode next;
public ListNode (int x)
{
val = x;
}
}*/
class Solution
{
// 返回从尾到头的列表值序列
public List<int> printListFromTailToHead(ListNode listNode)
{
//定义一个新链表
List<int> list = new List<int>();
//定义节点指向数据
ListNode node = listNode;
//输入的数据不为空的时候,就一直加
while (node != null)
{
list.Add(node.val);
node = node.next;
}
//定义第二个链表
List<int> re = new List<int>();
//从链表1的最后端倒序插入新链表
for (int i = list.Count - 1; i > -1; i--)
{
re.Add(list[i]);
}
//返回新链表
return re;
}
}
方法三:递归
具体的思路:指针遍历,如果这个指针的下一位是空的,输出一个数;不为空就继续往下循环。还有一件事啊!就是,你只要用递归法,一定要搞好这个循环和终止条件!!不要弄成个死循环。
代码实现:
using System.Collections.Generic;
/*
public class ListNode
{
public int val;
public ListNode next;
public ListNode (int x)
{
val = x;
}
}*/
class Solution
{
// 返回从尾到头的列表值序列
public List<int> printListFromTailToHead(ListNode listNode)
{
// write code here
//定义一个新链表
List<int> list = new List<int>();
//数据域不空,执行,空了的话,执行返回list
if (listNode != null)
{
//下一个数据域还不空,递归!!
if (listNode.next != null)
{
//一开始我没用list=后面,直接写了后面的,老实说,我不是很懂为何加上,哎!!
list = printListFromTailToHead(listNode.next);
}
//如果下一个空了,就在这个链表上加上他!!
list.Add(listNode.val);
}
//返回链表
return list;
}
}