#leetcode练习#25题.k个组翻转链表

一、题目描述
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

//链表一个重要的思路就是留一个头节点,后面的变化好了直接接入头节点就好
//所以可以定义一个哨兵
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

上述是题目中已经给出的类的定义以及实例化操作函数。
二、分析:
1.首先要判断接下来的链表中是否还包含K个数据,如果不包含直接跳出进行输出,因为要求这个不用排序。
2.进行翻转操作是用一个for循环来确定循环次数的,保证每次只进行K次循环。我用的方法比较笨,是从head进行寻找,第一次前进k个,将最后一个做为头;第二次是进行k-1次前进,直到结束。
3.整体程序分成上面的2块,定义变量如下:
guard 用来作为哨兵保存head;
first用来记录翻转的第一个;
aim用来表示操作目标;

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
		ListNode *guard = new ListNode(0);
		guard->next = head;
		head = guard;
		for(; ; ) {
			//part 1;
			int res_num = 0;
			ListNode* last = head->next;		//head -> next 由之前的定义决定
			for (int i = 0; i < k; i++) {
				if (last == NULL) {
					break;
				}
				res_num += 1;
				last = last->next;
			}
			if(res_num != k) {
				break;
			}
			//part 2;
			ListNode* first = head->next;
			for (int j = 0; j < k; j++) {
				int index = k-j-1;
				ListNode* aim = first;
				while(index --) {
					aim = aim->next;
				}
				head->next = aim;
				head = aim;
			}
			head->next = last;
		}
        return guard->next;
	}
 };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章