链表以k个一组进行翻转(2014美团研发笔试)

原创 2013年12月04日 14:38:45

给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6。

ListNode *reverseKGroup(ListNode *head, int k)
{
    if (head == nullptr || head->next == nullptr || k < 2)
        return head;
    ListNode *next_group = head;
    for (int i = 0; i < k; ++i)
    {
        if (next_group)
            next_group = next_group->next;
        else
            return head;
    }
// next_group is the head of next group
// new_next_group is the new head of next group after reversion
    ListNode *new_next_group = reverseKGroup(next_group, k);
    ListNode *prev = NULL, *cur = head;
    while (cur != next_group)
    {
        ListNode *next = cur->next;
        cur->next = prev ? prev : new_next_group;
        prev = cur;
        cur = next;
    }
    return prev; // prev will be the new head of this group
}

若末尾不足K的也进行翻转,则如下

/* Reverses the linked list in groups of size k and returns the
   pointer to the new head node. */
struct node *reverse (struct node *head, int k)
{
    struct node* current = head;
    struct node* next;
    struct node* prev = NULL;
    int count = 0;

    /*reverse first k nodes of the linked list */
    while (current != NULL && count < k)
    {
        next  = current->next;
        current->next = prev;
        prev = current;
        current = next;
        count++;
    }

    /* next is now a pointer to (k+1)th node
       Recursively call for the list starting from current.
       And make rest of the list as next of first node */
    if(next !=  NULL)
    {
        head->next = reverse(next, k);
    }

    /* prev is new head of the input list */
    return prev;
}

见Geeks、Leetcode

遍历一次链表,将元素反过来

/** * 只遍历一次单链表,将链表中的元素顺序反过来 * */ #include using namespace std; struct list_node //链表节点 { li...
  • leewon1988
  • leewon1988
  • 2013-08-20 23:11:05
  • 479

[2014美团网笔试]给定一个单链表和一个整数k,要求每隔k个元素翻转链表

//比如,原始链表1->2->3->4->5-6 //k=2, 2->1->4->3->6->5 //k=3, 3->2->1->6->5->4 //k=4, 4->3->2->1->5->6 #in...
  • u012294089
  • u012294089
  • 2013-09-29 22:25:35
  • 530

单向链表每k个元素翻转一次。

有一个单链表,请设计一个算法,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。例如链表1->2->3->4->5->6->7->8->null,K=3这个例子。调整后为,3->...
  • varyall
  • varyall
  • 2017-12-07 17:34:09
  • 29

链表翻转(按K个一组)

题目:链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6 ...
  • element137
  • element137
  • 2017-07-25 13:03:43
  • 145

单向链表每k个元素翻转一次。

有一个单链表,请设计一个算法,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。例如链表1->2->3->4->5->6->7->8->null,K=3这个例子。调整后为,3->...
  • w5761499123
  • w5761499123
  • 2017-03-12 14:03:34
  • 252

Leetcode017--链表k个结点一组翻转

单链表中k个一组进行反转
  • jinhuoxingkong
  • jinhuoxingkong
  • 2016-12-13 22:59:41
  • 317

LeetCode 25 Reverse Nodes in k-Group K个一组反转节点

题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified...
  • vvaaiinn
  • vvaaiinn
  • 2015-05-06 15:02:57
  • 2143

链表翻转(每K个结点进行一次逆置)

链表翻转 给出一个链表和一个数k,比如链表1→2→3→4→5→6 若k=2,翻转后2→1→4→3→6→5, 若k=3,翻转后3→2→1→6→5→4, 若k=4,翻转后4→3→2→1→5→6, 用程序实...
  • zhangyi_ZY
  • zhangyi_ZY
  • 2017-07-24 13:01:01
  • 286

[经典面试题]k节点一组旋转链表

【题目】 给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6。 如果节点的数...
  • SunnyYoona
  • SunnyYoona
  • 2014-12-16 11:35:41
  • 1431

K组翻转链表

题目给你一个链表以及一个k,将这个链表从头指针开始每k个翻转一下。 链表元素个数不是k的倍数,最后剩余的不用翻转。 样例 给出链表 1->2->3->4->5k = 2, 返回 2->1->4-...
  • qunxingvip
  • qunxingvip
  • 2016-07-14 17:07:03
  • 1168
收藏助手
不良信息举报
您举报文章:链表以k个一组进行翻转(2014美团研发笔试)
举报原因:
原因补充:

(最多只允许输入30个字)