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,贴了两种做法,迭代与递归。