K链表翻转

版权所有, 禁止转载, 如有需要, 请站内联系.

本文地址: http://blog.csdn.net/caroline_wendy

题目:

给出一个链表和一个数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;

用程序实现.

题目出自: 2014美团网校园招聘笔试试题 哈尔滨站 2013年9月10日

解答:

链表翻转问题, 可以使用递归进行求解, 即倒序打印, 依次倒序输出每段链表, 最后输出剩余链表;

笔试代码:

/*反转链表*/  ListNode* ReverseList (ListNode* pHead, ListNode* pTail) {     ListNode* pReversedHead = NULL;    ListNode* pNode = pHead;   ListNode* pPrev = NULL;    while (pNode != pTail)     {       ListNode* pNext = pNode->m_pNext;       if(pNext == pTail)            pReversedHead = pNode;         pNode->m_pNext = pPrev;         pPrev = pNode;         pNode = pNext;     }   return pReversedHead; }  /*K链表翻转*/  ListNode* KReverseList (const int k, ListNode* pHead) {     ListNode* pReversedList = NULL;    ListNode* pReversedTail = NULL;    int index = 0;     ListNode* pStart = pHead; //起始结点   ListNode* pEnd = pHead; //结尾结点     for(int i=0; i<k; ++i) {      pEnd = pEnd->m_pNext;       if(pEnd == NULL)          break;  }   pReversedList = ReverseList (pStart, pEnd);    pReversedTail = pStart;    pStart = pEnd;     while (1)   {       if(pEnd == NULL)          break;          pEnd = pEnd->m_pNext;       ++index;          if (index%k == 0) {           ListNode* pTemp = ReverseList (pStart, pEnd);          pReversedTail->m_pNext = pTemp;             pReversedTail = pStart;            pStart = pEnd;         }   }   if (pStart != NULL)        pReversedTail->m_pNext = pStart;    return pReversedList; } 

完整代码:

/*  * Test.cpp  *  *  Created on: 2014.2.27  *      Author: Spike  */  /*eclipse cdt, gcc 4.8.1*/  #include <stdio.h>  /*链表结点*/  struct ListNode {    int m_nKey;     ListNode* m_pNext; };  /*打印链表*/  void PrintList(ListNode* pHead) {  ListNode* pNode = pHead;   printf ("%d\t", pNode->m_nKey);    while (pNode->m_pNext != NULL) {        pNode = pNode->m_pNext;         printf ("%d\t", pNode->m_nKey);    }   return; }  /*反转链表*/  ListNode* ReverseList (ListNode* pHead, ListNode* pTail) {     ListNode* pReversedHead = NULL;    ListNode* pNode = pHead;   ListNode* pPrev = NULL;    while (pNode != pTail)     {       ListNode* pNext = pNode->m_pNext;       if(pNext == pTail)            pReversedHead = pNode;         pNode->m_pNext = pPrev;         pPrev = pNode;         pNode = pNext;     }   return pReversedHead; }  /*K链表翻转*/  ListNode* KReverseList (const int k, ListNode* pHead) {     ListNode* pReversedList = NULL;    ListNode* pReversedTail = NULL;    int index = 0;     ListNode* pStart = pHead; //起始结点   ListNode* pEnd = pHead; //结尾结点     for(int i=0; i<k; ++i) {      pEnd = pEnd->m_pNext;       if(pEnd == NULL)          break;  }   pReversedList = ReverseList (pStart, pEnd);    pReversedTail = pStart;    pStart = pEnd;     while (1)   {       if(pEnd == NULL)          break;          pEnd = pEnd->m_pNext;       ++index;          if (index%k == 0) {           ListNode* pTemp = ReverseList (pStart, pEnd);          pReversedTail->m_pNext = pTemp;             pReversedTail = pStart;            pStart = pEnd;         }   }   if (pStart != NULL)        pReversedTail->m_pNext = pStart;    return pReversedList; }  /*链表初始化*/  ListNode* init (void) {     ListNode* pHead = new ListNode();  ListNode* pNode1 = new ListNode();     ListNode* pNode2 = new ListNode();     ListNode* pNode3 = new ListNode();     ListNode* pNode4 = new ListNode();     ListNode* pNode5 = new ListNode();     pHead->m_nKey = 1;  pNode1->m_nKey = 2;     pNode2->m_nKey = 3;     pNode3->m_nKey = 4;     pNode4->m_nKey = 5;     pNode5->m_nKey = 6;     pHead->m_pNext = pNode1;    pNode1->m_pNext = pNode2;   pNode2->m_pNext = pNode3;   pNode3->m_pNext = pNode4;   pNode4->m_pNext = pNode5;   pNode5->m_pNext = NULL;     return pHead; }  /*主函数*/  int main (void) {     const int k = 3;   ListNode* pHead = init (); //初始化链表     printf("\nOriginal List: \t");    PrintList(pHead);   printf("\nNew List: \t");     ListNode* pReversedList = KReverseList (k, pHead);     PrintList(pReversedList);   return 0; }

输出:

Original List:     1   2   3   4   5   6    New List:  3   2   1   6   5   4   

转载于:https://blog.51cto.com/spikeking/1387939

编程算法/面试 - K链表翻转相关推荐

  1. 算法面试中单链表专题

    链表是算法面试中一个比较常考的内容,下面以面试中常见的算法题作为切入点: 首先来道开胃菜:92. 反转链表 解题思路: 这道题反转,我们可以考虑以头插法的方式来解决,这样一个好处是,我们对中间的链表进 ...

  2. 算法笔记一 链表的翻转(C++)

    一 两两交换链表的节点 问题具体见Leecode 算法练习24题 1.1问题分析 1.1.1非递归法 对于非递归的方法我们主要分为四个步骤 1.新建一个节点tamp,让这个节点的next指向头节点 2 ...

  3. 免费下载 | 超全算法题精解,一本能“在线”编程的面试宝典

    点击这里立即下载:<程序员面试宝典> 内容介绍 备战大厂怎么能少了尖兵利刃? <程序员面试宝典>正式发布,助你一臂之力!70+算法面试模拟题深度解析,涵盖 树.排序.二分查找. ...

  4. k均值算法 二分k均值算法_如何获得K均值算法面试问题

    k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...

  5. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

  6. 2021字节跳动校招秋招算法面试真题解题报告--leetcode148 排序链表,内含7种语言答案

    148.排序链表 1.题目描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序 2.解题报告 针对nlogn的排序算法,主要有快速排序,归并排序和堆排序.其中,堆排序利用了数 ...

  7. c++链表获取长度,链表翻转,查找链表倒数第K个节点以及中间点

    c++链表获取长度,链表翻转, 查找链表倒数第K个节点以及中间点 测试数据 ListNode* pHead = new ListNode();pHead->m_key = 1;ListNode* ...

  8. 2019多益笔试编程和面试的算法题

    2019多益笔试编程和面试的算法题 多益网络笔试编程题:字符串的指定位数组合 原题概述(只记得大概): 题目解答 多益网络面试算法题:不用比较找出两数中的较大值和较小值 原题概述: 题目解答 代码示例 ...

  9. 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。

    今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...

最新文章

  1. 遗传算法应用(实例详细演示最小生成树的prufer编码和Cayley定理)
  2. 正版七日杀服务器存档,七日杀网吧怎么存档 七日杀网吧存档读档方法介绍-游侠网...
  3. 8.使用Xshell5密钥登录liunx
  4. 全国大学生电子设计大赛 赛前准备
  5. d3.js 入门指南
  6. python re模块compile_Python re模块的match方法
  7. java自动触发_我们可以自动使用应用程序触发器调用后台任
  8. 英文数据集txt_【美股量化07篇】Python获取标普500成分股数据
  9. Python识别图片指定区域文字内容
  10. linux内核态访问串口,linux内核中串口驱动注册过程(tty驱动)[转]
  11. XSS.haozi.me刷题
  12. qt编译出错 /usr/bin/ld 找不到 -lGL cannot find -lGL
  13. 走出误区,老杨命运发生了转折
  14. 礼物帮手-论文(不全)
  15. 华为近场通讯nfc在哪里打开_华为手机nfc感应区在手机哪个位置
  16. git-如何将本地分支与远程分支关联
  17. C# DataView常见操作
  18. C++的throw抛出异常机制
  19. Linux命令 cat命令
  20. 商业地产如何走出高空置率困局?

热门文章

  1. oracle 11g 静默安装
  2. iOS:ASIHttpRequest虽不更新,但仍值得详细了解
  3. 并发计算 VS 并行计算
  4. UNIX高级环境编程 第11、12章 线程同步及属性
  5. 马哥教育20-2期27号学员的7.27上课笔记
  6. thinkphp 连接sql server
  7. java中关于时间的格式化
  8. SpringMVC请求后台地址URL没有.*的几种实现方式
  9. Unicode,ANSI,UTF-8的故事
  10. 选择更安全的方式注册你的puppet节点