链表翻转。给出一个链表和一个数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,用程序实现
思想:采用遍历链表,分成length/k组,对每组进行逆转,逆转的同时要将逆转后的尾和头连接起来,写得有点乱。
// Klist.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdio.h" #include "stdlib.h" typedef struct Node{ int value; Node* next; }LinkList; void Converse(LinkList* pPre,LinkList* pCur) { //链表逆转 LinkList* p = NULL; LinkList* pNext = NULL; p = pPre->next; LinkList* p1 = NULL; if(pCur!=NULL) pNext = pCur->next; while( p!=pNext) { p1 = p->next; p->next = pPre; pPre = p; p = p1; } } int _tmain(int argc, _TCHAR* argv[]) { int count = 0, k,i=0,j=0,flag = 1,length=0,groups = 0; scanf("%d",&k); LinkList* pPre = (LinkList*)malloc(sizeof(LinkList)); LinkList* pCur = (LinkList*)malloc(sizeof(LinkList)); LinkList* pNext = (LinkList*)malloc(sizeof(LinkList)); LinkList* head = NULL; LinkList* pTempTail = NULL; //指向逆转之后的尾部 LinkList* pTempHead = NULL; pCur->value = 1; pPre = pCur; //创建初始链表 for(i=1;i<6;i++) { LinkList* node = (LinkList*)malloc(sizeof(LinkList)); node->value = i+1; pCur->next = node; pCur = node; } pCur->next = NULL;//最后一定要置NULL,c++中用new则无须置NULL pCur = pPre; while(pCur!=NULL) { length++; pCur = pCur->next; } i=0; groups = length/k; //分成K段 pCur = pPre; while(i<=groups) { count = 0; while(count<k-1 && i<groups) { pCur = pCur->next; count++; } if(i<groups) { pNext = pCur->next; pTempHead = pCur; /*没做翻转之前的头部,变成了翻转之后的尾部*/ if(flag == 0) { pTempTail->next = pTempHead; } Converse(pPre,pCur); pTempTail = pPre; if(flag==1){ head = pCur; flag = 0; } pCur = pNext; } else{ pTempTail->next = pNext; } pPre = pCur; i++; } pCur = head; while(j<length) { j++; printf("%d",pCur->value); pCur = pCur->next; } system("pause"); return 0; }