链表翻转。比如给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5
2017-07-24 10:26
239 查看
链表翻转
题目:链表翻转。给出一个链表和一个数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,用程序实现Node* RotateList(Node* list, size_t k). 提示:这个题是链表逆置的升级变型。算法思想:
这个题是链表逆置的升级变型,我们可以将此链表先按照以k为单位分为若干个小链表,再将小链表进行翻转,最后将小链表链接起来,依次进行,当小链表的长度小于k时,将其直接连接在链表后面即可。
部分代码图示:
代码实现:
#include #include #include typedef int DataType; typedef struct ListNode { DataType _data; struct ListNode* _next; }Node,*pNode,*pList; void Init(pList* pplist) { assert(pplist); *pplist = NULL; } pNode BuyNode(DataType x) { pNode pnode = (pNode)malloc(sizeof(Node)); if (pnode == NULL) { perror("malloc"); return NULL; } pnode->_data = x; pnode->_next = NULL; return pnode; } void Push(pList* pplist,DataType x) { pNode NewNode = BuyNode(x); if (*pplist == NULL) { *pplist = NewNode; } else { pNode cur = *pplist; while (cur->_next) { cur = cur->_next; } cur->_next = NewNode; } } pNode Reverse(pList plist) { pNode cur = plist; if(cur == NULL) return NULL; if (cur->_next) { Reverse(cur->_next); } printf("%d ", cur->_data); return cur; } pNode getLastNode(pList plist) { pNode pHead = plist; while (pHead->_next != NULL) { pHead = pHead->_next; } return pHead; } pNode SwapListByK(pList plist, size_t k) { pNode pnode = plist; pNode pNewNode; pNode pNextNode; pNode LastNode = NULL; pNode tmp = NULL; size_t pos; if (k <= 1) return plist; plist = NULL; while (pnode) { pos = 0; pNewNode = pnode; while (pnode && pos < k - 1) { tmp = pNewNode; pnode = pnode->_next; if (pnode == NULL) { break; } pos++; } if (pnode == NULL) { return tmp; //如果需要反转的不足k个元素,则直接连在后面 } if (pnode) { pNextNode = pnode->_next; pnode->_next = NULL; if (LastNode != NULL) { LastNode->_next = NULL; } pNewNode = Reverse(pNewNode); if (plist == NULL) plist = pNewNode; else LastNode->_next = pNewNode; pnode = getLastNode(pNewNode); pnode->_next = pNextNode; LastNode = pnode; pnode = pNextNode; } else { break; } } return pnode; } void Printf(pList plist) { pList cur = plist; while (cur) { printf("%d ", cur->_data); cur = cur->_next; } printf(" NULL\n"); } void Test() { pList plist; Init(&plist); Push(&plist, 1); Push(&plist, 2); Push(&plist, 3); Push(&plist, 4); Push(&plist, 5); Push(&plist, 6); Push(&plist, 7); Printf(plist); pNode ret = SwapListByK(plist, 3); Printf(ret); }
测试结果:
相关文章推荐
- 链表翻转。给出一个链表和一个数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
- 9月10日,美团网2014校招研发笔试哈尔滨站 1、链表翻转。给出一个链表和一个数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,用程序实现
- 链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5。
- 链表翻转。给出一个链表和一个数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,用程序实现
- 链表翻转(给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5)
- 链表翻转。给出一个链表和一个数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
- 面试题:题目: 链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5
- 链表翻转。给出一个链表和一个数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,用程序实现
- 链表翻转。给出一个链表和一个数K,按照分组逆置。
- 链表翻转:给出一个链表和一个数k,链表前k个节点进行翻转
- 第7题 微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交,并找出第一个相交结点。
- 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。
- java 删除LinkedList链表中的结点(只给出一个结点)
- 翻转一个双向链表的时间复杂度是 $O(1)$
- 用递归和非递归两种方法翻转一个链表
- 一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起, 给出一个age, 在 链表中删除学生年龄等于age的学生信息。
- 链表的基本操作 (1)采用尾插法建立一个链表; (2)输入一个元素,在道表中查找该元素是否存在,请给出相关信息; (3)将链表中的元素进行就地逆置。
- 给出两个单向链表的头指针,比如h1、h2, 判断链表是否相交
- 寻找一个单向链表的中项,如果存在两个则返回前一个,给出算法描述
- 25. Reverse Nodes in k-Group 怎样不使用额外空间翻转一个单向链表?