题目:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
第一种方法 :迭代法(双指针)
代码:
var reverseList = function(head) {
var prev = null; // 临时节点,当作反转后结点的最末null
var curr = head
var temp = null; // 占位一个空间, 用于存下一个结点
while(curr){
temp = curr.next; // ①
curr.next = prev; // ②
prev = curr; // ③
curr = temp; // ④
}
return prev; // prev为反转后链表的头结点
};
1.定义一个prev,用于指向前一结点,存入反转后的尾结点null(让原链表头结点1指向的那个)
2.定义一个temp,赋值为null,实际作用为占位一个空间,用于指向后一结点
3.反转的过程 图例:
好了,本想用画的方式来描述更好一些,但是发现没有明显色差的笔
看不懂的可以去力扣
上面有做好的图例,很清晰
第二种方法:递归
代码:
var reverseList = function(head) {
if(head === null || head.next === null){
return head;
}
var newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
};
就是通过层层嵌套,遍历到最后一个节点后,从它开始依次向上执行
head.next.next = head;
head.next = null;
也就是这样色儿的
详细图例也可以去力扣
相信难不倒各位看官
最后,祝各位看官前程似锦。