【题目描述】
输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
【解决方案】
1. 最普通的方法,先反转链表,再输出。但是,由于反转会改变链表结构,不推荐;
2. 典型的“后进先出”,联想到栈,可以输出到栈中,再以此读取;
3. 栈可以用递归实现,故可以用递归实现。如果数据量大,可能导致方法调用栈溢出,所以,最好还是显示地用递归实现。
我的代码实现1,仅供参考:
1 ///2 /// 反转链表后输出 3 /// 4 public static void PrintLinkedListValueReverse(ListNode head) 5 { 6 if (head == null) 7 return; 8 9 ListNode headReverse = new ListNode(head.Value);10 ListNode temp = null;11 12 //反转链表13 while (head.Next != null)14 {15 head = head.Next;16 temp = new ListNode(head.Value);17 temp.Next = headReverse;18 headReverse = temp;19 }20 21 //输出反序链表22 while (headReverse != null)23 {24 Console.WriteLine(headReverse.Value);25 headReverse = headReverse.Next;26 }27 }
我的代码实现2,仅供参考:
1 ///2 /// 利用栈输出 3 /// 4 public static void PrintLinkedListValueReverse(ListNode head) 5 { 6 if (head == null) 7 return; 8 9 Stack stack = new Stack ();10 11 //入栈12 while (head != null)13 {14 stack.Push(head.Value);15 head = head.Next;16 }17 18 //出栈19 while (stack.Count != 0)20 {21 Console.WriteLine(stack.Pop());22 }23 }
我的代码实现3,仅供参考:
1 ///2 /// 利用递归输出 3 /// 4 public static void PrintLinkedListValueReverse(ListNode head) 5 { 6 if (head != null) 7 { 8 PrintLinkedListValueReverse(head.Next); 9 Console.WriteLine(head.Value);10 }11 }