单链表反转

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表反转相关的知识,希望对你有一定的参考价值。

参考:【图文解析】反转一个单链表
作者:giturtle
发布时间: 2019-03-18 15:26:38
网址:https://blog.csdn.net/qq_42351880/article/details/88637387?spm=1001.2014.3001.5501

例题描述

反转一个链表

示例:

  • 输入: 1->2->3->4->5->NULL
  • 输出: 5->4->3->2->1->NULL

结构体定义

struct ListNode {
	int val;
	struct ListNode *next;
};

思路

先对原链表做头部切割,再对新链表做头插

  • 定义一个新head头指针,标记为newHead,将它初始为NULL,并非指向NULL,最后我们选择返回这个newHead指针作为新链表的头指针。

  • 定义一个结点node作为"临时中转站",初始化与否并无大影响。

  • 进行循环遍历链表各个结点,判定head指针是否为空,即是否到达了原链表的结尾。如果不为空,说明还没有到达尾部。如果程序第一次运行就没有进入循环,说明传入了一个空链表,此时返回newHead新链表的头指针,同样返回NULL,这样处理也是合理的。

  • 以下开始逆序链表逻辑:在当前指针不为NULL时,先对原链表做头删操作,再对新链表做头插操作。即使用循环进行操作:

  • 让node指针指向传入函数链表的头指针head,两指针指向保持相同。

  • 然后让head指针指向它的next结点,此时旧链表已经完成了头删操作。第一个结点已经被"切割"下来。接下来要做的就是对新链表进行头插操作,使结点放入新链表。

  • 让node指针的next下一个结点指向新链表的头指针newHead,完成结点的链接,即头插入新的链表中。然后更新newHead指向为新链表的头结点。进行下一次循环。

  • 最终head指针指向了原链表的结尾,即为NULL,退出循环,此时新链表已经反转完毕,情况如图:
  • 最终返回新链表头指针newHead即可。

代码实现

struct ListNode *reverseList(struct ListNode* head) {
	struct ListNode *newHead = NULL;
	struct ListNode *node;
	while (head != NULL) {
		//1. 对之前的链表做头部切割
		node = head;
		head = head->next;
		
		//2. 对新链表做头插
		node->next = newHead;
		newHead = node;
	}
	return newHead;
}

以上是关于单链表反转的主要内容,如果未能解决你的问题,请参考以下文章

手撕代码之反转单链表

反转单链表

单链表反转

小代码 单链表之反转 然后交错重连+稀疏矩阵

递归-反转单链表 -图解

看一遍就理解,图解单链表反转