其实反转链表,会运用到经典的尾插法。为了防止指针丢失,在前半部分指针(pre)断链的时候,一定要跟踪到后半部分指针(next),也就是说一定要拿一个变量去装后面的指针。可以根据代码画一个动态图。自己画,印象会很深刻。
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let pre = null
let cur = head
while(cur){
let next = cur.next
cur.next = pre
pre = cur
cur = next
}
return pre
};
以上代码就是单链表反转。对于初学者的话,有可能会放在浏览器上去运行,发现跑不起来,这是为什么呢。因为我们并没有构造单链表的结构,对,没错,链表是需要自己构造的。而数组不用自己去构造,new一下就出来了,以下就是一个用类来构造一个链表的结构,入参是一个数组,返回值是一个单链表结构。
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let pre = null
let cur = head
while(cur){
let next = cur.next
cur.next = pre
pre = cur
cur = next
}
return pre
};
// 构造一个链表结构
class ListNode {
constructor(value) {
this.value = value;
this.next = null;
}
}
function arrayToList(array) {
if (!array || !array.length) {
return null;
}
// 把数组的第一个值转成链表结构并且赋值给head指针
let head = new ListNode(array[0]);
// 让current指向head指针
let current = head;
// 循环数组来构造链表结构
for (let i = 1; i < array.length; i++) {
// 给current结点的next指针存储new ListNode(array[i])的值
current.next = new ListNode(array[i]);
// 让current指针指向current的下一个结点
current = current.next;
}
return head;
}
// 使用方法
let array = [1, 2, 3, 4, 5];
let head = arrayToList(array);
reverseList(head);
通过以上练习,可以很轻松的实现链表的反转啦。