这道简单题,两个简单的思路,链表的思路基本比较类似:使用额外数据结构存储迭代遍历的val、快慢指针等等。
方法一:使用数组存储遍历结果,再反向遍历添加到新的链表中。
事件复杂度O(2n),空间复杂度(n)
/**
* 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) {
if (!head) return null;
let arr = [];
let node = head;
while (node) {
arr.push(node.val);
node = node.next;
}
let index = 0;
let dummy = new ListNode();
let current = dummy;
while (index !== arr.length) {
current.next = new ListNode();
current = current.next;
current.val = arr[arr.length - index - 1];
index++;
}
return dummy.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 index = head;
let newhead = new ListNode();
//遍历链表,并对新链表使用头插法;
while (index) {
let temp = index;
index = index.next;
temp.next = newhead.next;
newhead.next = temp;
}
return newhead.next;
};