链表翻转:给出一个链表和一个数k,链表前k个节点进行翻转
来源:互联网 发布:网络拓扑管理 编辑:程序博客网 时间:2024/04/26 23:42
问题描述:
给出一个链表和一个数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。
这是一道美团网的现在上面是题,下面有个人的做法,对大家进行讲解,程序猿最直接的自然是代码,话不多说先上代码:
#include<iostream>#include<stdlib.h>using namespace std;struct ListNode{ int _data; ListNode* _next; ListNode(int x = 0) :_data(x) , _next(NULL) {}};typedef ListNode Node;Node* createList(int* arr, int length) { Node* pHead = NULL; Node* pTemp, *pNode; pTemp = NULL; for (int i = 0; i < length; i++) { pNode = (Node*)malloc(sizeof(Node)); pNode->_data = arr[i]; pNode->_next = NULL; if (NULL == pHead) pHead = pNode; else pTemp->_next = pNode; pTemp = pNode; } return pHead;}void destroyList(Node* pHead) { Node* pNode; while (pHead) { pNode = pHead; pHead = pHead->_next; free(pNode); }}void PrintfList(Node* head){ Node* phead = head; while (phead) { cout << phead->_data << " "; phead = phead->_next; } cout << endl;}Node* reverseList(Node* pHead) { if (NULL == pHead || NULL == pHead->_next) return pHead; Node* pNode; Node* pNewHead = NULL; while (pHead) { pNode = pHead; pHead = pHead->_next; pNode->_next = pNewHead; pNewHead = pNode; } return pNewHead;}Node* getLastNode(Node* pHead) { while (NULL != pHead->_next) pHead = pHead->_next; return pHead;}Node* swapListByK(Node* pHead, int k) { if (k <= 1) return pHead; int pos; Node* pNode = pHead; Node* pNewHead; Node* pNextNode; Node* pLastNode = NULL;; pHead = NULL; while (pNode) { pos = 0; pNewHead = pNode; while (pNode && pos < k - 1) { pNode = pNode->_next; pos++; } if (pNode) { pNextNode = pNode->_next; pNode->_next = NULL; if (NULL != pLastNode) { pLastNode->_next = NULL; } pNewHead = reverseList(pNewHead); if (NULL == pHead) { pHead = pNewHead; } else { pLastNode->_next = pNewHead; } pNode = getLastNode(pNewHead); pNode->_next = pNextNode; pLastNode = pNode; pNode = pNextNode; } else { break; } } return pHead;}int main(){ int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int length = sizeof(arr) / sizeof(arr[0]); Node* pHead = createList(arr, length); pHead = swapListByK(pHead, 2); PrintfList(pHead); destroyList(pHead); system("pause"); return 0;}
解题思路在于每一个变换节点指向的保存,翻转次数的确定,通过循环,两者之间相互交替工作,完成任务。循环变量的控制,就是翻转次数k,每完成一次k=k-1,当k<0时,退出循环。
首先要有新的链表的头指针,以及没有旋转部分的头指针,旋转部分的最后一个节点的指针,这是最重要的三部分,还有就是旋转过程中的中间变量。将旋转动作单独封装为一个动作,进行调用。
阅读全文
0 0
- 链表翻转:给出一个链表和一个数k,链表前k个节点进行翻转
- 链表翻转。给出一个链表和一个数K,按照分组逆置。
- 链表翻转,每k个进行翻转
- 翻转链表 给定一个链表个一个整数k 将从右边k个翻转到前边
- [2014美团网笔试]给定一个单链表和一个整数k,要求每隔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,用程序实现
- 链表翻转。给出一个链表和一个数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=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=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6
- k链表翻转
- 链表翻转。给出一个链表和一个数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,比如链表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翻转链表
- K组翻转链表
- 链表K个节点翻转
- 链表K个节点翻转
- “智能问诊”项目——数据处理(1)
- 回顾Java各大排序算法(持续更新)
- 中国的人工智能雄心:2030年成全球领导者
- 机器学习与数据挖掘
- mysql锁
- 链表翻转:给出一个链表和一个数k,链表前k个节点进行翻转
- R语言reshape2包-官方文档学习
- 小狐狸VF的一些命令及技巧
- 数据仓库类型变化选择
- python 中类的继承
- 远程连接win7上VMWare安装的linux虚拟机
- Android 编译 发生 MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8 sequence
- 笨方法学Python 习题 1: 第一个程序
- Android动画全面剖析-属性动画高级用法