leetcode链表--15、everse-nodes-in-k-group(按照k值进行k个结点的逆序)

题目描述

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

解题思路:本题借鉴链表的逆序的思路,中间使用栈进行存储

1)定义tmp记录目前存入栈s中的结点个数,如果tmp<k,中存入栈s中

2)tmp == k时,就将栈s中的结点弹出,链接在新链表p上,以上1) 2)完成一次k个结点的操作

3)当所有结点遍历完成,有两种情况,一种恰好剩k个结点,一种剩少于k个结点

对于恰好剩k个结点,则弹出s,链接在新链表上

对于少于k个结点,则不需要逆序,因此定义另外一个栈s1顺序变回来,然后再链接在新链表上

4)h1->next = NULL,且返回head->next

 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 *reverseKGroup(ListNode *head, int k) {
12         if(head == NULL || k<=1)
13             return head;
14         ListNode *pNode = head;
15         stack<ListNode *> s;
16         stack<ListNode *> s1;
17         int tmp = 0;
18         ListNode *h = new ListNode(0);
19         ListNode *h1 = h;
20         while(pNode)
21         {
22             if(tmp < k)
23             {
24                 s.push(pNode);
25                 pNode = pNode->next;
26                 tmp++;
27             }
28             else
29             {
30                 while(!s.empty())
31                 {
32                     h1->next = s.top();
33                     s.pop();
34                     h1 = h1->next;
35                 }
36                 tmp = 0;
37             }
38         }
39         if(tmp == k)
40         {
41             while(!s.empty())
42             {
43                 h1->next = s.top();
44                 s.pop();
45                 h1 = h1->next;
46             }
47         }
48         else
49         {
50             while(!s.empty())
51             {
52                 s1.push(s.top());
53                 s.pop();
54             }
55             while(!s1.empty())
56             {
57                 h1->next = s1.top();
58                 s1.pop();
59                 h1 = h1->next;
60             }
61         }
62         h1->next = NULL;
63         return h->next;
64     }
65 };
时间: 2024-10-15 05:11:31

leetcode链表--15、everse-nodes-in-k-group(按照k值进行k个结点的逆序)的相关文章

设计鲁棒性的方法:输入一个链表的头结点,逆序遍历打印该链表出来

之前有过整理链表等的概念和基本算法.比较重要的是插入,删除,遍历,建表(尾插法,头插法) 回忆链表尾部插入结点:  1 #include <iostream> 2 using namespace std; 3  4 typedef struct Node{ 5     int data;//数据域 6     Node *next;//指针域 7 } Node, *List; 8  9 //在单链表的末位添加一个结点10 void addNode(List *head, int value)1

链表逆序2

问题来源:选自LeetCode 92:反转链表 II 问题描述: 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL 题目给定信息: 问题分析: 这道题也是要求实现链表的逆序,但是不同的地方在于要求在链表中规定的某一部分实现链表的逆序.那么我们可以把这个链表分为三部分

单链表逆序操作

//逆序操作//算法1:从第二个节点开始,记录它的下一个节点,然后依次挪到第一个节点之前成为新表头int inverse_node(struct node pH){struct node p = pH; //头结点struct node pPrev = NULL; //记录前一个节点struct node pBack = NULL; //记录下一个节点地址struct node *pFirstNode = p->pNext; //记录第一个节点 //节点只有1个或者无有效节点时,返回原来的链表,

java版的单向链表的逆序输出

将单向链表逆序输出,方法有三种: a.遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组(最简单的做法) b.使用栈来逆序输出 c.直接将链表逆序然后输出(本文采用的方法) 先介绍算法: 1). 若链表为空或只有一个元素,则直接返回: 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继: 3). 重复2),直到q为空 4). 调整链表头和链表尾 示例:以逆序A->B->C->D为例,图示如下 package com.moluo.shujujiegou;

LeetCode[Linked List]: Reverse Nodes in k-Group

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 nod

LeetCode解题报告--Swap Nodes in Pairs

题目: Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should use only constant space. You may not modify the values in the list

【LeetCode】025. Reverse Nodes in k-Group

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in

乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group

乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group 一.前言 将一个链表按照一定的长度切成几部分,然后每部分进行翻转以后再拼接成一个链表是比较困难的,但是这也能锻炼我们的思维能力. 二.Reverse Nodes in k-Group 2.1 问题 2.2 分析与解决     最简单的想法,我们可以将链表分成几部分,每一个部分分开考虑,比如使用头插法,正好可以将顺序颠倒一下,或者我们通过某种方式使得顺序发生改变,然后再结合起来. /** * Definiti

Leetcode 线性表 Swap Nodes in Pairs

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Swap Nodes in Pairs Total Accepted: 12511 Total Submissions: 39302 Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the