JZ24 反转链表
描述
给定一个单链表的头结点pHead
(该头节点是有值的,比如在下图,它的val
是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤10000≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
示例1
输入:
{1,2,3} |
返回值:
{3,2,1} |
示例2
输入:
{} |
返回值:
{} |
说明:
空链表则输出空 |
题解1
使用栈当做中转站,把每个节点倒过来,然后重新拼成一个新链表
/** |
题目细节
结点3为tail
变量,经过while
循环,会使用尾插法将结点1和2都插入到3后面,这期间,结点2和3和next
指针都经过了处理,而最后一个结点1的next
指针(结点1的next
原本是指向结点2的)却没有处理,因为此时已经跳出了while
循环。如果不将结点1的下一个结点置为空,则会在结点1和2之间形成环,程序输出会如下:
3,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2... |
题解2
使用两个结点求解,将摘下来的每一个结点使用头插法插入到新的链表中,如图画了程序两步的情况
/** |
扩展思维
其实用vector
容器顺序存放各个结点,然后出来的时候使用头插法新建链表也可以,这样分离结点的时候可能不太容易出错
/** |
同样也可以不使用vector
/** |
tip:之前头插法一直记错了,如果头结点没有数据的话,可以使用下面的操作
node->next = head->next; |
但是如果头结点有值,就要用下列的插入
node->next = head; |
解法3
原地反转,用三个指针逆置
/** |
解法4
使用递归解决
/** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ruvikm!