反转链表
Table of Contents
反转链表
参考视频地址
非递归实现
过程描述
需要两个指针prev, head在链表中进行移动;另外还需要一个指针save,用来保存head节点的下一个节点
举例说明
初始化的时候
- prev  1(head)->2->3->4->null
- prev = null
 - head = 1
 - save = null
 
 
第一次循环
改变指针的指向
- prev<-1(head)  2->3->4->null
- prev = null
 - head = 1
 - save = 2
 
 
往右平移prev,head
- null<-1(prev)  2(head)->3->4->null
- prev = 1
 - head = 2
 - save = 2
 
 
第二次循环
改变指针指向
- null<-1(prev)<-2(head)  3->4->null
- prev = 1
 - head = 2
 - save = 3
 
 
往右平移指针prev,head
- null<-1<-2(prev)  3(head)->4->null
- prev = 2
 - head = 3
 - save = 3
 
 
第三次循环
改变指针指向
- null<-1<-2(prev)<-3(head)  4->null
- prev = 2
 - head = 3
 - save = 4
 
 
往右平移指针prev,head
- null<-1<-2<-3(prev)  4(head)->null
- prev = 3
 - head = 4
 - save = 4
 
 
第四次循环
改变指针指向
- null<-1<-2<-3(prev)<-4(head) null
- prev = 3
 - head = 4
 - save = null
 
 
往右平移指针prev,head
- null<-1<-2<-3<-4(prev) null(head)
- prev = 4
 - head = null
 - save = null
 
 
循环结束条件
根据第四次循环的结果,可以看到循环的终止条件就是head=null
最后返回的头部
prev就是反转后链表的头部
javascript代码实现
let reverseList = function(head){
  let prev = null;
  while(head){
    // 改变指向
    let save = head.next;
    head.next = prev;
    // 向右平移prev和head指针
    prev = head;
    head = save;
  }
  return prev;
}
python实现
def reverseList(head):
  prev = None
  while(head):
    # 改变指向
    save = head.next
    head.next = prev
    # 向右平移prev和head指针
    prev = head
    head = save
  return prevc++实现
ListNode* reverseList(ListNode* head){
  
}
递归实现
def reverseList(head):
  if head == None or head.next == None:
    return head
  let new_head = reverseList(head.next)
  head.next.next = head
  head.next = null
  return new_head