LeetCode Online Judge 题目C# 练习 - Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
REMEBER: 有关列表的题目要注意处理涉及到head Node的情况

 1         public static LinkedListNode ReverserLinkedListIIOpt(LinkedListNode head, int m, int n)
 2         {
 3             LinkedListNode fakehead = new LinkedListNode();
 4             fakehead.Next = head;
 5             LinkedListNode node_m = head;
 6             LinkedListNode node_n = head;
 7             LinkedListNode prev_m = fakehead;
 8             LinkedListNode next_n = head;
 9 
10             for (int i = 1; i < m; i++)
11             {
12                 prev_m = prev_m.Next; 
13                 node_m = node_m.Next;
14             }
15 
16             for (int i = 1; i < n; i++)
17                 node_n = node_n.Next;
18 
19             next_n = node_n.Next;
20 
21             node_n.Next = null;
22 
23             TopQuestions.ReverseSignlyLinkedListIterative(node_m);
24 
25             prev_m.Next = node_n;
26             node_m.Next = next_n;
27 
28             return fakehead.Next;
29         }
30 
31         public static LinkedListNode ReverseSignlyLinkedListIterative(LinkedListNode head)
32         {
33             if (head == null || head.Next == null)
34                 return head;
35 
36             LinkedListNode pre = null;
37             LinkedListNode curr = head;
38             LinkedListNode next = null;
39 
40             while (curr != null)
41             {
42                 next = curr.Next;
43                 curr.Next = pre;
44                 pre = curr;
45                 curr = next;
46             }
47 
48             return pre;
49         }
50 
51         public static LinkedListNode ReverseSinglyLinkedListRecursive(LinkedListNode head)
52         {
53             if (head == null || head.Next == null)
54                 return head;
55 
56             LinkedListNode p = head.Next;
57             head.Next = null;
58             LinkedListNode newhead = ReverseSinglyLinkedListRecursive(p);
59             p.Next = head;
60             return newhead;
61         }

代码分析:

  做linkedlist的题,我总会在前面加个fakehead,这样基本上能应付head需要被操作的corner case。 返回fakehead.Next就完了。

  这题里用到了Reverse Singly Linked List,贴了两种做法,迭代与递归。

 

posted @ 2012-10-12 22:34  ETCOW  阅读(415)  评论(0编辑  收藏  举报