以k个元素为一组反转单链表

Example:
  input: 1->2->3->4->5->6->7->8->NULL and k = 3
  output:3->2->1->6->5->4->7->8->NULL

Node* inverstList(Node *head, int num)
{
    Node *prev, *curr, *next;
    int count = 0;

    if (num == 0 || num == 1)
        return head;

    prev = head;
    curr = prev->next;
    next = curr->next;

    while (num-1 > count)
    {
        if (curr != NULL)
        {
            next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;

            count++;
        }
        else
        {
            curr = prev->next;
            prev->next = NULL;
            while (count > 0)
            {
                next = curr->next;
                curr->next = prev;
                prev = curr;
                curr = next;

                count--;
            }
            return prev;
        }
    }

    if (next != NULL)
        head->next = inverstList(next, num);
    else
        head->next = NULL;

    return prev;
}
时间: 2024-10-31 03:48:24

以k个元素为一组反转单链表的相关文章

【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】

[092-Reverse Linked List II(反转单链表II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->

【LeetCode-面试算法经典-Java实现】【023-Merge k Sorted Lists(合并k个排好的的单链表)】

[023-Merge k Sorted Lists(合并k个排好的的单链表)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 题目大意 合并k个排好的的单链表.分析和描述它的复杂性. 解题思路 使用小顶堆来实现,先将K个链表的头结点入堆,取堆顶元素,这个结点就是最小的,接

算法题:反转单链表

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:存在一个单链表,头指针为head,实现单链表的反转Node *Reverse(Node *head).  该算法的求解办法有很多,如: 方法1:先顺序变量单链表,将结点保存到栈中,在从栈中弹出结点,重新建立一个新的单链表: 方法2:用<剑指offer>里面给出的算法,用三个指针来实现: 方法3:采用递归实现,是方法2的递归实现形式. 本文主要给出方法2和方法3,在给出具体的代码之前,先要注意几个问题:          (1)如果hea

反转单链表并验证(详解)

单链表优点: 可以动态增加和删除. 不需要定义初始大小. 点链表缺点: 不能随机访问.需要逐个遍历直到找到目标项. 用到动态内存分配和指针,代码复杂度提升,内存泄漏和内存段错误风险提升. 开销大较大,因为是动态分配内存.而且每项需要存储一个额外的指针. 定义单链表: ------------------------------ ------------------------------ | | | \ | | | | val | next |--------------| val | next

递归、非递归 反转单链表

定义链表结构 struct ListNode { int val; ListNode *next; ListNode(int v) : val(v), next(NULL) {} }; 非递归反转单链表 ListNode* reverse(ListNode *root) { if (root == NULL || root->next == NULL) return root; ListNode *cur = root->next; root->next = NULL; while (c

C语言:【单链表】逆置反转单链表

#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode {     DataType data;     struct SListNode* next; }SListNode; SListNode* BuyNode(DataType x) {     SListNode* next = (SListNode*)malloc

Leetcode25---&gt;Reverse Nodes in k-Group(以k个节点为段,反转单链表)

题目: 给定一个单链表,一次反转k个节点,最终返回翻转后的链表的头节点:如果链表不足k个,则不变 举例: 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.  首先要确定链表的头节点newHead;即如果链表的节点个数大

leetCode 25.Reverse Nodes in k-Group (以k个节点为一组反转链表) 解题思路和方法

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 valu

高效代码之反转单链表

单链表的反转是经常用到的 那么单链表的高效转换就很重要了.这里记录一下.方便用时查阅. struct ListNode { int m_nValue; ListNode * m_pNext; }; //实现如下: //反转链表需要3个指针 //1.指向当前元素pNode //2.指向当前元素的前一个元素pPrev //3.指向当前元素的后一个元素pNext ListNode* ReverseList(ListNode* pHead) { ListNode* pReverseHead = NULL