反转链表
将一条单向链表,反转,返回反转后的链表。 例:1->2->3->4->5 转换为 5->4->3->2->1
思路一:定义多个指针进行互换
- 先定义3个指针,pre(代表反转后的链表头结点) cur(代表未反转链表的头节点) next(未反转的下一位)
- 第一步让pre指向空,cur指向当前链表头节点,next指向当前cur的下一位节点。
- 第二步让cur指向pre,然后将pre移动到cur的位置,cur移动到next的位置,next移动到再下一位节点
- 重复第二步操作,直至链表走到末尾,最后返回pre就是反转后的链表。
思路一:JS代码实现
var reverseList = function(head) {
if (!head) return null;
let pre = null; // 反转链表的头结点
let cur = head; // 未反转头结点
let next = head.next; // 下一位结点
while (cur) {
cur.next = pre; // 当前节点的下一位 指向pre
pre = cur; // pre 移动到当前链表头节点位置
cur = next; // 当前头节点位置往后移动一位
next && (next = next.next) // 如果下一位不为空,那么代表链表还有值,下一位再移动一位,至此完成了一个节点反转,继续循环直至链表结束。
}
return pre; // 返回反转链表头结点
};
思路二:递归法
递归交换节点,交换时将当前节点赋值给交换节点之后下一位节点、
思路二:代码实现
var reverseList = function(head) {
if (!head) return head; // 如果链表为空返回当前链表
if (!head.next) return head; // 如果链表只有一位,那么也返回当前链表
let next = head.next; // 下一位结点
let p = reverseList(head.next); // 获取反转后的链表头节点
head.next = next.next; // 将当前节点反转
next.next = head; // 将下下个节点指回当前头节点 如 1 2 3 ,当前节点是 2,然后将3->2,最后将1连接到2后面 就是 3->2->1
return p;
};