LeetCode 25
Reverse Nodes in k-Group
Problem Description:
将链表中每k个结点进行逆转,如果要进行逆转的结点数小于k,则不逆转,保持原顺序。
具体的题目信息:
https://leetcode.com/problems/reverse-nodes-in-k-group/description/Solution:
- 解题思路:遍历链表获取链表长度
length
,根据k
值(将其定义为每个进行逆转的子链表的长度)求出能逆转的子链表数length/k
,注意头结点的处理。最后将长度不足k
的链表接在已经完成逆转的链表后面即可。 - 编程实现:
- 解题思路:遍历链表获取链表长度
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if (head == NULL)
return head;
if (head->next == NULL)
return head;
stack<int> temp;
ListNode* p = head, *q, *t;
int len = getlength(head);
//用count记录能逆转的子链表个数
int count = len/k;
int flag = 0;
while(count--) {
//用栈存储值,在构造链表实现逆转
for (int i = 0; i < k; i++) {
temp.push(p->val);
p = p->next;
}
//如果是第一个进行逆转的子链表,需要改变头结点的位置
if (flag == 0) {
t = new ListNode(temp.top());
head = t;
temp.pop();
t->next = NULL;
while(!temp.empty()) {
q = new ListNode(temp.top());
temp.pop();
q->next = t->next;
t->next = q;
t = q;
}
flag = 1;
} else {
while(!temp.empty()) {
q = new ListNode(temp.top());
temp.pop();
q->next = t->next;
t->next = q;
t = q;
}
}
}
//剩下的不足k个结点的子链表直接连在所有逆转的链表后面
t->next = p;
return head;
}
//获取链表长度
int getlength(ListNode* t) {
int len = 0;
ListNode* p = t;
while(p) {
len++;
p = p->next;
}
return len;
}
};