标签:
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
For example,
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
有一个链表,将其分为k个节点一组,反转组内元素然后返回这个被修改的链表。
如果最后一个分组内节点不足k个,那么这个分组保持不变。
你不能修改节点内的value,只能修改节点指针。
只能使用常数空间。
此题虽然描述略有啰嗦,但还是很直观的,对于链表的操作通常都是比较麻烦的,非常考验逻辑能力,也是面试常问到题目类型,如果能一气呵成的正确写出代码,就一定能打动面试官。这道题的思路也很简单,只要遍历链表取出每个分组,然后进行翻转,然后将翻转后的链表拼接到结果上。思路虽然简单,但是真的做起来还是不容易的,下面给出代码:
void reverse(ListNode* p, int k); ListNode* reverseKGroup(ListNode* head, int k) { ListNode fake_head(0); ListNode* p = &fake_head; ListNode* p1 = head; while (p1 != NULL) { ListNode* p2 = p1; for (int i=0; i<k-1; ++i) { if (NULL==p2) break; p2 = p2->next; } if (NULL==p2) break; ListNode* pnext = p2->next; reverse(p1, k); p->next = p2; p = p1; p1 = pnext; } p->next = p1; return fake_head.next; } void reverse(ListNode* p, int k) { ListNode* prev = NULL; for (int i=0; i<k; ++i) { ListNode* pnext = p->next; p->next = prev; prev = p; p = pnext; } }
很明显,时间复杂度是O(n)的。
标签:
原文地址:http://www.cnblogs.com/zhiguoxu/p/5467896.html