方法一,创建新节点
解题思路
1.创建p指针,初始值为null;创建tem,表示临时节点,用于接受新创建的节点
2.遍历头节点
3.每次遍历都创建新节点,赋值tem,相当于复制了一次当前遍历中的节点。然后让tem尾部指向p,接着更新p节点位置,p节点来到tem。
4.head = head.next,让循环继续走下去
5.遍历结束,返回p,即是倒序后的指针
代码,也附上了我leetcode题解,欢迎给我点赞哦
var reverseList = function(head) {
let p = null
let tem
while(head) {
tem = new ListNode(head.val)
tem.next = p
p = tem
head = head.next
}
return p
}
作者:hou-sheng-ren
链接:https://leetcode.cn/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-mei-ci-bian-li-chuan-5i5h/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二,不需要创建新节点
解题思路
1.特殊情况,head为null,直接返回
2.创建p指针,我们将遍历到的节点一次拼到p节点上,并希望最后返回p即可
3.遍历。需要借助临时变量tem,来指向当前遍历中的节点的下一个节点,用于最后更新head,让循环能继续往下走。遍历时,其实就两件大事,一是将当前节点的next指向p,二是更新p的位置。
4.循环结束。发现实际无论链表多长,遍历都会漏掉最后一个节点。需要这样处理:
head.next = p
p = head
return p
代码,也附上了我leetcode题解
var reverseList = function(head) {
if(!head) return head
let p = null
let tem
while(head.next) {
tem = head.next // 记录当前节点的下一个节点,以便下一次遍历
// 1.当前节点指向p
head.next = p
// 2.1之后更新p位置
p = head
head = tem // 移动到下一节点位置
}
// 观察发现,最后一个节点,必定不满足循环条件。所以需要拼接一下head节点
head.next = p
return head
}
作者:hou-sheng-ren
链接:https://leetcode.cn/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-bu-xu-yao-chuang-jia-lbhb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。