[面试备忘]单链表逆置

题目:将单链表逆置

#include <iostream>

typedef struct __node
{
	int value;
	__node* next;
} NODE, *PNODE;

PNODE reverse(PNODE head)
{
	if (!head) {
		return head;
	}
	PNODE curNode = head;
	PNODE nextNode = head->next;
	head->next = NULL;
	while (nextNode) {
		PNODE afterNextNode = nextNode->next;
		nextNode->next = curNode;
		curNode = nextNode;
		nextNode = afterNextNode;
	}
	return curNode;
}

PNODE reverse_recursionA(PNODE head)
{
	if (head == NULL || head->next == NULL) {
		return head;
	}
	PNODE temp = reverse_recursionA(head->next);
	head->next = temp->next;
	temp->next = head;
	return head;
}

PNODE reverse_recursionB(PNODE head)
{
	if (head == NULL || head->next == NULL) {
		return head;
	}
	PNODE temp = reverse_recursionB(head->next);
	head->next->next = head;
	return temp;
}

PNODE reverse_recursionC(PNODE cur, PNODE pre)
{
	if (NULL == cur) {
		return pre;
	}
	PNODE temp = cur->next;
	cur->next = pre;
	return reverse_recursionC(temp, cur);
}

void printList(PNODE head)
{
	PNODE curNode = head;
	while (curNode) {
		std::cout << curNode->value << ' ' << std::flush;
		curNode = curNode->next;
	}
	std::cout << std::endl;
}

int main()
{
	PNODE head = new NODE();
	head->value = 0;
	head->next = NULL;
	PNODE tail = head;
	for (int index = 1; index != 100; ++index) {
		PNODE newNode = new NODE();
		newNode->value = index;
		newNode->next = head;
		head = newNode;
	}
	std::cout << "Original: " << std::endl;
	printList(head);
	head = reverse(head);
	std::cout << "After reverse: " << std::endl;
	printList(head);
	tail = head;
	head = reverse_recursionB(head);
	tail->next = NULL;
	std::cout << "After one reverse_recrusionB: " << std::endl;
	printList(head);
	reverse_recursionA(head);
	PNODE temp = head;
	head = tail;
	tail = temp;
	std::cout << "After reverse_recursionA: " << std::endl;
	printList(head);
	tail = head;
	head = reverse_recursionC(head, NULL);
	std::cout << "After reverse_recursionC: " << std::endl;
	printList(head);
	
	PNODE curNode = head;
	while (curNode) {
		PNODE temp = curNode->next;
		delete curNode;
		curNode = temp;
	}
	return 0;
}

  

reverse使用普通循环方法。

reverse_recursionA使用递归实现,一次调用完成逆置全部工作,但没有返回逆置后的头结点,只能预先记录尾结点。

reverse_recursionB使用递归实现,最后返回新头结点,但一次调用后需要额外将原先的头结点next置空。

reverse_recursionC使用递归实现,一次完成全部工作,并返回新头结点,但有额外参数,取巧。

  

posted @ 2011-08-25 14:53  lifengzhong  阅读(494)  评论(0编辑  收藏  举报