链表反转步骤分解附图

该思路需要创建三个指向节点的指针,分别是current、current_previous、current_next.

创建current指向头节点,创建current_next指向空,创建current_previous指向空。具体如下:

代码:参考连接:https://www.cnblogs.com/wanglei5205/p/8572458.html

反转链表函数的返回值为反转链表之后的头指针

Node* reverse_list(Node* head_ptr) {
	Node* current = head_ptr;
	Node* cur_previous = NULL;
	Node* cur_next = NULL;
	Node* reverse_head = NULL;
	while (current != NULL) {
		cur_next = current->link();
		if (cur_next == NULL) {
			reverse_head = current;
		}
		current->set_link(cur_previous);
		cur_previous = current;//更新cur_previous
		current = cur_next;//更新current
	}
	return reverse_head;
}

Node 节点的创建使用了类,其中link()是Node节点的成员函数,返回的是该节点的指针域,set_link(Node* ptr)是用于设置Node节点的指针域的一个成员函数,具体实现参考:https://blog.csdn.net/Li_haiyu/article/details/88673845

结合代码分析:

步骤一、current指向头节点,current_next指向current的下一个节点,current_previous指向空。

步骤二、current的指针域指向current_previous,更新current_previous和current.

步骤二 ①:current的指针域指设置为current_previous

步骤二 ②:更新current_previous和current,更新方法为:current_previous = current,current = current_next

步骤三、一次循环结束,到下一次循环,又回到步骤1,current_next = current的下一个节点

然后到步骤2:current的指针域指向current_previous,更新current_previous和current.

步骤二 ①:current的指针域指设置为current_previous

步骤二 ②:更新current_previous和current,更新方法为:current_previous = current,current = current_next

步骤四、又一次循环结束了,继续往下执行到步骤1:curren_next指向current的下一个节点

看代码,current_next == NULL 了,到达if判断,所以将current节点作为反转链表之后的头指针,此时reverse_head获取的current值指向节点C

然后继续执行步骤二:current的指针域指向current_previous,更新current_previous和current.

步骤二 ①:current的指针域指设置为current_previous

步骤二 ②:更新current_previous和current,更新方法为:current_previous = current,current = current_nex

达到while循环退出条件(current == NULL),搞定!(这里需要注意的是虽然current现在指向NULL,但是reverse_head获取的是更新current前那个current所指向的节点也即是节点C)

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

当然啦,看完这个分析过程,可以看到其实最后返回的是节点C的指针即可,所以可以将代码简化为直接返回current_previos即可。

Node* reverse_list(Node* head_ptr) {
	Node* current = head_ptr;//当前节点
	Node* cur_previous = NULL;//当前节点的前一个节点
	Node* cur_next = NULL;//当前节点的后一个节点
	while (current != NULL) {
		cur_next = current->link();
		current->set_link(cur_previous);//指针反转
		cur_previous = current;//更新cur_previous
		current = cur_next;//更新current
	}
	return cur_previous;

参考连接:https://www.cnblogs.com/wanglei5205/p/8572458.html

猜你喜欢

转载自blog.csdn.net/Li_haiyu/article/details/88668383