链表翻转。给出一个链表和一个数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=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k).


思路:取出长度为k的链表将其翻转,在链接到链表里。


#include<iostream>    
using namespace std;    

typedef struct LNode {    
	int Value;
	struct LNode* Next;    
}LNode;    

LNode* reverseList(LNode* pHead) {    
	if (NULL == pHead || NULL == pHead->Next)    
		return pHead;    
	LNode* pNode;    
	LNode* pNewHead = NULL;    
	while (pHead) {    
		pNode = pHead;    
		pHead = pHead->Next;    
		pNode->Next = pNewHead;    
		pNewHead = pNode;    
	}    
	return pNewHead;    
}    

LNode* getLastNode(LNode* pHead) {    
	while (NULL != pHead->Next)    
		pHead = pHead->Next;    
	return pHead;    
}    

LNode* swapListByK(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 = 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;    
}    

void printList(LNode* pHead) {    
	LNode* pNode = pHead;    
	while (pNode) {    
		cout << pNode->Value << " ";    
		pNode = pNode->Next;    
	}    
	cout << endl;    
}    

LNode* createList(int* arr, int length) {    
	LNode* pHead = NULL;    
	LNode* pTemp, *pNode;    
	for (int i = 0; i < length; i++) {    
		pNode = (LNode*)malloc(sizeof(LNode));    
		pNode->Value = arr[i];    
		pNode->Next = NULL;    
		if (NULL == pHead)    
			pHead = pNode;    
		else    
			pTemp->Next = pNode;    
		pTemp = pNode;    
	}    
	return pHead;    
}    

void destroyList(LNode* pHead) {    
	LNode* pNode;    
	while (pHead) {    
		pNode = pHead;    
		pHead = pHead->Next;    
		free(pNode);    
	}    
}    

int main()   
{    
	int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};    
	int length = sizeof(arr) / sizeof(arr[0]);    
	LNode* pHead = createList(arr, length);    

	pHead = swapListByK(pHead, 4);    

	printList(pHead);    
	destroyList(pHead);     
	system("pause");
	return 0;    
}    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值