很久没有打理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:
Given1->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.
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 };