编程算法 - 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	



编程算法 - K链表翻转_第1张图片

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