逆转链表

利用三个节点:

第一个节点用于返回,也就是新的链表头节点;

第二个节点是当前节点,第三个节点是当前节点的next节点

code如下

/*  
* Copyright (c) 2011 alexingcool. All Rights Reserved.  
*/ 
#include <iostream>

using namespace std;

int array[] = {5, 7, 6, 9, 11, 10, 8};
const int size = sizeof array / sizeof *array;

struct Node
{
	Node(int i = 0, Node *n = NULL) : item(i), next(n) {}

	int item;
	Node *next;
};

Node* construct(int (&array)[size])
{
	Node dummy;
	Node *head = &dummy;

	for(int i = 0; i < size; i++) {
		Node *temp = new Node(array[i]);
		head->next = temp;
		head = temp;
	}

	return dummy.next;
}

Node* reverse(Node *head)
{
	if(head == NULL) {
		cout << "link is null" << endl;
		return NULL;
	}

	Node *newHead = NULL, *pHeadNext = head;

	while(pHeadNext) {
		head = pHeadNext;
		pHeadNext = pHeadNext->next;
		head->next = newHead;
		newHead = head;
	}

	return newHead;
}

void reverse2(Node *root, Node* &head, Node* &tempHead)
{
	if (root == NULL)
		return;

	reverse2(root->next, head, tempHead);
	if (head == NULL)
	{
		head = root;
		tempHead = head;
	}
	else
	{
		tempHead->next = root;
		tempHead = root;
		tempHead->next = NULL;
	}
}

void print(Node *head)
{
	while(head) {
		cout << head->item << " ";
		head = head->next;
	}
}

void main()
{
	Node *head = construct(array);
	cout << "source link: ";
	print(head);
	cout << endl;
	Node *newHead2 = NULL;
	Node *tempHead = NULL;
	reverse2(head, newHead2, tempHead);
	print(newHead2);
	cout << endl;
}

逆转链表最优雅的循环解法:

Node* reverse(Node *head)
{
	if(head == NULL) {
		cout << "link is null" << endl;
		return NULL;
	}

	Node *previous = NULL, *pHead = head;

	while(pHead) 
	{
		Node *temp = pHead->next;
		pHead->next = previous;
		previous = pHead;
		pHead = temp;
	}

	return previous;
}

优雅的递归算法:


Node* reverseLink(Node *link)
{
	if (link->next == NULL) {
		return link;
	}

	Node *node = reverseLink(link->next);
	Node *ptr = link->next;
	link->next = link->next->next;
	ptr->next = link;
	return node;
}


Node* reverseLink(Node *head)
{
	if (head == NULL || head->next == NULL)
		return head;

	Node *node = reverseLink(head->next);
	head->next->next = head;
	head->next = NULL;

	return node;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值