题解 | #反转链表#
反转链表
https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
/*function ListNode(x){ this.val = x; this.next = null; }*/ function ReverseList(pHead) { // write code here // 链表只有头节点或为空的情况 if(pHead === null|| pHead.next === null) return pHead; // 定义两个空节点,temp用于存放根节点的下一个节点,而pre用于存放上一个节点 let temp = null, pre = null while(pHead) { temp = pHead.next; pHead.next = pre; pre = pHead; pHead = temp; } return pre; } module.exports = { ReverseList: ReverseList, };
解题思路
该题最简单的解法是采用双指针的解法,首先考虑清楚,反转之后的链表其实就是将指针的指示方向进行逆向。
以头节点pHead为例,反转之后它指向一个null节点,而它原来的下一个节点指向它。但是我们需要注意,在进行pHead->next = pre,之前,需要对之前的pHead->next节点利用临时空节点temp进行保存,防止丢失。我最初考虑在进行pHead.next= pre,之后让temp.next = pHead,但这么做是没有必要的,我们只需要让pre始终记录当前需要反转的节点的前一个节点,而temp始终记录该节点下一个节点即可(即 pre = pHead pHead = temp)。