LeetCode OJ - Reverse Nodes in k-Group
来源:互联网 发布:整容后遗症 知乎 编辑:程序博客网 时间:2024/05/23 19:11
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步不反转。思路比较简单,对于k个元素为一组,维护该组之前的一个指针pre_left。遍历k个元素,
得到k个元素末尾的指针pre_right和下一组开始的指针cur。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: void reverse(ListNode **head, ListNode **tail) { if(*head == *tail) return; if(!*head || !(*head)->next) return; ListNode *cur = (*head)->next; ListNode *pre = *head; ListNode *next; while(cur != *tail) { next = cur->next; cur->next = pre; pre = cur; cur = next; }cur->next = pre; *tail = *head; *head = cur; } ListNode *reverseKGroup(ListNode *head, int k) { if(k == 0) return head; int n = 0; ListNode dummy(0); dummy.next = head; ListNode *cur = head; ListNode *left_pre = &dummy; ListNode *right_pre = &dummy; while(cur) { left_pre = right_pre; ListNode *start = cur; int i; for(i = 0; i < k && cur; i++) { right_pre = cur; cur = cur->next; } if(i != k) break; reverse(&start, &right_pre); left_pre->next = start; right_pre->next = cur; } return dummy.next; }};
下面的代码更加漂亮一些:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: void reverse(ListNode **head, ListNode **tail) { (*tail)->next = NULL; if(!*head || !(*head)->next) return; ListNode *cur = (*head)->next; ListNode *pre = *head; ListNode *next; *tail = *head; while(cur) { next = cur->next; cur->next = pre; pre = cur; cur = next; } *head = pre; } ListNode *reverseKGroup(ListNode *head, int k) { if(k == 0) return head; int n = 0; ListNode dummy(0); dummy.next = head; ListNode *cur = head; ListNode *left_pre = &dummy; ListNode *right_pre = &dummy; while(cur) { left_pre = right_pre; ListNode *start = cur; int i; for(i = 0; i < k && cur; i++) { right_pre = cur; cur = cur->next; } if(i == k) { reverse(&start, &right_pre); left_pre->next = start; right_pre->next = cur; } } return dummy.next; }};
0 0
- LeetCode OJ:Reverse Nodes in k-Group
- LeetCode OJ - Reverse Nodes in k-Group
- LeetCode OJ Reverse Nodes in k-Group
- LeetCode OJ | #25 Reverse Nodes in k-Group
- LeetCode:Reverse Nodes in k-Group
- LeetCode: Reverse Nodes in k-Group
- LeetCode : Reverse Nodes in k-Group
- leetcode 42: Reverse Nodes in k-Group
- [Leetcode] reverse nodes in K-Group
- [LeetCode]Reverse Nodes in k-Group
- LeetCode-Reverse Nodes in k-Group
- LeetCode - Reverse Nodes in k-Group
- LeetCode | Reverse Nodes in k-Group
- 【leetcode】Reverse Nodes in k-Group
- Leetcode: Reverse Nodes in k-Group
- leetcode Reverse Nodes in k-Group
- [LeetCode] Reverse Nodes in k-Group
- LeetCode题解: Reverse Nodes in k-Group
- 编程之美--2.1 求二进制数中1的个数
- c++ try_catch throw
- hdoj2767 Proving Equivalences(强连通分量+缩点)
- Eclipse+ADT对android应用签名打包详解
- POJ 2886 Who Gets the Most Candies?
- LeetCode OJ - Reverse Nodes in k-Group
- 【排序】表插入排序算法(C语言版)
- 算法导论习题解-第24章单源最短路径
- HDOJ1018 神奇的log
- C++ RasDial之调用RasEnumEntries遍历系统中存在的宽带连接名称
- HOJ 12811 单词对比(很巧的处理方法,运用26个字母的个数)
- Python学习笔记02 变量和程序的编写
- uva 1541 - To Bet or Not To Bet(记忆化+概率)
- 教大家怎么识别苹果手机真假