数据结构-链表

159 阅读1分钟
特点
  • 数据呈线性排列,元素存储不连续,用next指针连接。
  • 添加和删除比较方便,访问比较耗时;
操作
  • 修改next
  • 遍历链表
数据结构

    function ListNode(val) {
      this.val = val;
      this.next = null;
    }
    
    const blue = new ListNode('Bule');
    const yellow = new ListNode('Yellow');
    const red = new ListNode('Red');
    blue.next = yellow;
    yellow.next = red;

    
    //遍历链表:访问数据时,需要从头开始查找,如果是在链表最后,需要的时间就是O(n);
    let p = blue;
    while(p){
      console.log(p.val);  // Blue Yellow Red
      p = p.next;
    }
   // 修改next 
   // 添加和删除数据只需要更改指针的指向,需要的时间就是O(1);
   blue.next = red;
   console.log(blue.next.val); // Red

链表.png

练习题

237. 删除链表中的节点

// 复制下一个节点,删除下一个节点
var deleteNode = function(node) { 
    node.val = node.next.val; 
    node.next = node.next.next;
};

206. 反转链表

// 遍历时,将当前节点的next指针指向前一个节点
var reverseList = function(head) { 
    let p1 = head; 
    let p2 = null; 
    while(p1) { 
        const temp = p1.next; 
        p1.next = p2; 
        p2 = p1; 
        p1 = temp; 
    } 
    return p2; 
};

83. 删除排序链表中的重复元素

// 因为链表是排序好的,所以重复元素出现的位置是连续的;如果当前值和下一个值相等,指针指向下一个的下一个
var deleteDuplicates = function(head) { 
    let p = head; 
    while(p && p.next){
        if (p.val===p.next.val){ 
            p.next = p.next.next; 
        }else { 
            p = p.next;
        } 
    } 
    return head; 
};

2. 两数相加

// 相同的位置相加,不存在补0,超过10补充到下一个节点,
var addTwoNumbers = function(l1, l2) { 
    let l3 = new ListNode(0); 
    let p1 = l1; 
    let p2 = l2; 
    let p3 = l3; 
    let temp = 0; 
    while(p1||p2){ 
        let val1 = p1?p1.val:0; 
        let val2 = p2?p2.val:0; 
        let val3 = val1+val2+temp; 
        val3= val3>9?val3%10:val3; 
        temp = Math.floor((val1+val2+temp)/10); 
        p3.next = new ListNode(val3); 
        if (p1) p1 = p1.next; 
        if (p2) p2 = p2.next; 
        p3 = p3.next; 
    } 
    if (temp) p3.next = new ListNode(temp); 
    return l3.next; 
};

141. 环形链表

// 快慢指针,如果有环,快慢指针一定会未来重逢;
var hasCycle = function(head) { 
    let p1 = head; 
    let p2 = head; 
    while(p1&&p2&&p2.next) { 
        p1 = p1.next; 
        p2 = p2.next.next; 
        if (p1===p2) return true 
    } 
    return false 
};