【算法】反转链表

147 阅读1分钟

基本思路

在遍历链表时,将当前节点的 next指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

代码实现

迭代法

借助pre变量与next变量,防止迭代过程中丢失链表

//迭代法:
var reverseList = function(head){
  //if(head === null || head.next === null){
  // return head
  //}简写:
  // 当链表为 null 或链表中仅有一个节点时,不需要反转
  if(!head || !head.next){
    return head
  }
  
  let prev = null //pre变量指向上一个结点(对象)
  let curr = head //当前节点
  //直到head为null结束循环,此时pre变量指向链表最后一个结点(对象)
  while(curr){
    let tmp = curr.next ////断开链表之前先存储curr的下一个节点,避免链表丢失即tmp变量指向下一个结点(对象)
    curr.next = prev
    prev = curr
    curr = tmp
  }
  head = prev
  return head
}

相关练习题

leetcode:206.反转链表

牛客网:BM1 反转链表

学习资料: bilibili:反转链表