1. 双向链表相关
class Node {
constructor(data) {
this.data = data; // 节点的数据域
// this.prev = null; // 节点的指针域
this.next = null; // 节点的指针域
}
}
class SingleList {
constructor() {
this.size = 0; // 单链表的长度
this.head = new Node('head'); // 表头节点
this.currNode = ''; // 当前节点的指向
}
// 判断单链表是否为空
isEmpty() {
return this.size === 0;
}
// 获取单链表的最后一个节点
findLast() {
let currNode = this.head;
while (currNode.next) {
currNode = currNode.next;
}
return currNode;
}
// 单链表的遍历显示
display() {
let result = '';
let currNode = this.head;
while (currNode) {
result += currNode.data;
currNode = currNode.next;
if(currNode) {
result += '->';
}
}
console.log(result);
}
// 从当前位置向前移动 n 个节点。
advance(n, currNode = this.head) {
this.currNode = currNode;
while ((n--) && this.currNode.next) {
this.currNode = this.currNode.next;
}
return this.currNode;
}
// 在单链表中寻找item元素
find(item) {
let currNode = this.head;
while (currNode && (currNode.data !== item)) {
currNode = currNode.next;
}
return currNode;
}
// 显示当前节点
show() {
console.log(this.currNode.data);
}
// 获取单链表的长度
getLength() {
return this.size;
}
// 向单链表中插入元素
insert(item, element) {
let itemNode = this.find(item);
if(!itemNode) { // 如果item元素不存在
return;
}
let newNode = new Node(element);
newNode.next = itemNode.next; // 若currNode为最后一个节点,则currNode.next为空
itemNode.next = newNode;
this.size++;
}
// 在单链表中删除一个节点
remove(item) {
if(!this.find(item)) { // item元素在单链表中不存在时
return;
}
// 企图删除头结点
if (item === 'head') {
if (!(this.isEmpty())) {
return;
} else {
this.head.next = null;
return;
}
}
let currNode = this.head;
while (currNode.next.data !== item) {
// 企图删除不存在的节点
if (!currNode.next) {
return;
}
currNode = currNode.next;
}
currNode.next = currNode.next.next;
this.size--;
}
// 在单链表的尾部添加元素
append(element) {
let currNode = this.findLast();
let newNode = new Node(element);
currNode.next = newNode;
this.size++;
}
// 清空单链表
clear() {
this.head.next = null;
this.size = 0;
}
}
var l1 = new SingleList();
l1.append(2);
l1.append(4);
l1.append(3);
var l2 = new SingleList();
l2.append(5);
l2.append(6);
l2.append(4);
var addTwoNumbers = function(l1, l2) {
console.log('l===',l1,l2);
const l3 = new Node(0) // 定义一个链表来存放结果
let p1 = l1.head.next // 指向链表1的头部
let p2 = l2.head.next // 指向链表2的头部
let p3 = l3
let carry = 0 // 进位的数,即留到下一轮相加的数
while(p1 || p2) {
// 这两个三元判断是为了防止相加的两个数长度不同
const v1 = p1 ? p1.data : 0
const v2 = p2 ? p2.data : 0
const val = v1 + v2 + carry
carry = Math.floor(val / 10) // 相加后的十位数
p3.next = new Node(val % 10) // 相加后的个位数
// 指针继续往后走
if(p1) p1 = p1.next
if(p2) p2 = p2.next
p3 = p3.next
}
// 处理特殊情况:如[2,2,7] + [5,6,4]这种加到最后一个还有进位的情况
if(carry) {
p3.next = new SingleList(carry)
}
console.log('l3==',l3.next);
return l3.next
};
addTwoNumbers(l1,l2);