[LeetCode]Reverse Linked List II

很久没有打理cnblog的站点了,用octopress在github上搭了一个新主页,学术一些的笔记po用markdown在github主页更新。

之前偶尔翻翻careercup,也会用白纸写些代码,但是很难坚持上机验证,链表/树的测试用例有些麻烦。暑假的时候刷了一些USACO的题目,OJ题难度略高,不是很适合准备面试。

以上内容,一言以蔽之,曰:懒。

正找工作的师兄推荐了LeetCode这个面试题OJ平台,题目难度和careercup相当,是个不错的练习平台。在暑假实习面试被狂虐以后,是时候知耻而后勇了。计划每天做两道题,3个月左右完成。立贴为证。

今天的题目是部分链表逆序,将给定链表第m个节点到第n个节点的位置逆序,返回逆序后的链表。这是M记的暑期实习生面试的一道题目之一。链表似乎是M记面试最爱,没有什么高深的算法。

解题思路:指针pp指向第m-1个节点,用p, q记录第m个节点和第n个节点,先将p,q都指向头节点,q比p先走n-m步,然后p,q一起走m步,即指向制定位置。将这部分链表逆序,将pp指向q,p指向第n+1个节点。注意m=1的情况。

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->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *reverseBetween(ListNode *head, int m, int n) {
12         // Note: The Solution object is instantiated only once and is reused by each test case.
13         if(head==NULL)
14             return head;
15         
16         ListNode *p = head, *q = head, *pp = NULL;
17         for(int i = 1; i<n-m+1; ++i)
18             q = q->next; // point to the end of reversed list
19         for(int i=1; i<m; ++i)
20         {
21             pp = p;
22             p = p->next;
23             q = q->next;
24         }
25         // reverse p to q
26         ListNode *a = p->next;
27         while(p!=q)
28         {
29             ListNode *b = a->next;
30             a->next = p;
31             p = a; a = b;
32         }
33         if(pp)
34         {
35             pp->next->next = a;
36             pp->next = q;
37         }
38         else
39         {
40             head->next = a;
41             head = q;
42         }
43         
44         return head;
45     }
46 };

原文地址:https://www.cnblogs.com/practice/p/3382409.html