编程算法/面试 - K链表翻转

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	




你可能感兴趣的:(链表,递归,笔试,Mystra,K链表翻转)