链表反转
来源:互联网 发布:ps4网络nat类型失败 编辑:程序博客网 时间:2024/06/03 19:35
链表翻转。给出一个链表和一个数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→6→5,用程序实现。
思路是网上搜的最多的那种,从链表中提取K个元素,反转后再接入链表。但是发现网上的代码不能处理题目中最后一种情况即最后还有元素但不足K个,这里做了补充。
pNextNode = reversenode(pNextNode); pLastNode->next = pNextNode;pNextNode 是上一次反转完成后的最后一个元素的下一个元素,也就是下一次反转的第一个元素,pLastNode是上一次反转后的最后一个元素。将前者后面的链表(元素不足K)反转后再将接入之前的链表。 下面是反转链表的C语言代码,根据网上代码修改的。创建链表时以-1结束输入。
#include <stdio.h>#include <stdlib.h>typedef struct Node{ int data; struct Node *next;}lnode;//不带头节点lnode * reversenode(lnode *head){ if(head == NULL) return head; lnode *pnode; lnode *cur = NULL; while(head) { pnode = head; head = head->next; pnode->next = cur; cur = pnode; } return cur;}lnode * createnode(){ lnode *head = (lnode*)malloc(sizeof(lnode)); head = NULL; lnode *cur = NULL; lnode *pre = (lnode*)malloc(sizeof(lnode)); int num; while(1) { printf("input a number:"); scanf("%d",&num); printf("\n"); if(num == -1) break; cur = (lnode*)malloc(sizeof(lnode)); cur->data = num; if(head == NULL) head = cur; pre->next = cur;// pre = cur; } cur->next = NULL; return head;}lnode* getLastNode(lnode* pHead) { while (NULL != pHead->next) pHead = pHead->next; return pHead;}lnode *reverseallnode(lnode *pHead,int k){ if (k <= 1) return pHead; int pos; lnode* pNode = pHead; lnode* pNewHead; lnode* pNextNode; lnode* 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 = reversenode(pNewHead); if (NULL == pHead) { pHead = pNewHead; } else { pLastNode->next = pNewHead; } pNode = getLastNode(pNewHead); pNode->next = pNextNode; pLastNode = pNode; pNode = pNextNode; } else { break; } }//对不满K个的节点进行反转 pNextNode = reversenode(pNextNode); pLastNode->next = pNextNode; return pHead;}int main(){ lnode *createnode(); lnode *reverseallnode(lnode*,int n); lnode *head = (lnode*)malloc(sizeof(lnode)); head = createnode(); head = reverseallnode(head,3); while(head) { printf("%d ",head->data); head = head->next; } return 0;}
0 0
- 链表反转
- 反转链表
- 单向链表反转
- 链表反转:
- 链表的反转
- 链表反转
- 反转单向链表
- 链表反转
- 单向链表反转
- 单向链表反转
- 链表的反转
- 链表反转
- 反转链表
- 链表反转
- 链表反转
- 链表反转
- 链表反转
- 链表的反转
- Dijkstra算法(单源最短路径)
- 在同一个地方生活
- Java基础视频教程-概述
- NSArray 演示(无注释)
- 什么是白箱测试、黑箱测试、回归测试?
- 链表反转
- perl socket编程
- unity3d XML配置表读写
- SVN更改登录用户
- C++ 类型转换
- iOS多线程和runLoop介绍
- C# 调用PrintDocument对象进行打印和测试
- 双击退出Android 软件,释放驻留内存
- CC2530 Power Management