要求
反转一个单链表
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
方法一
采用三指针实现
使用三个指针,第一次将head.next 反转为 null, 之后current指针每移动一次,反转指针转向一次.
var reverseList = function(head) {
if(head === null || head.next === null) {
return head;
}
let pre = head;
let current = head.next;
let next;
head.next = null;
while(current) {
next = current.next;
current.next = pre;
pre = current;
current = next;
}
return pre;
}
方法二
递归实现
每次递归都操作三个指针.其中两个为递归过程时的 head 和 head.next指针, 一个为 pre 末尾元素的指针.
递归时 head 保留着对 pre末尾元素的指向, 因此递归到链表末尾,回溯时反转链表.
var reverseList = function(head) {
if(head === null || head.next === null) {
return head;
}
var pre = reverseList(head.next);
head.next.next = head;
head.next = null;
return pre;
}
链表递归变化
pre before: ListNode { val: 5, next: null }
pre after: ListNode { val: 5, next: ListNode { val: 4, next: null } }
pre before: ListNode { val: 5, next: ListNode { val: 4, next: null } }
pre after: ListNode {
val: 5,
next: ListNode { val: 4, next: ListNode { val: 3, next: null } } }
pre before: ListNode {
val: 5,
next: ListNode { val: 4, next: ListNode { val: 3, next: null } } }
pre after: ListNode {
val: 5,
next:
ListNode { val: 4, next: ListNode { val: 3, next: [ListNode] } } }
pre before: ListNode {
val: 5,
next:
ListNode { val: 4, next: ListNode { val: 3, next: [ListNode] } } }
pre after: ListNode {
val: 5,
next:
ListNode { val: 4, next: ListNode { val: 3, next: [ListNode] } } }