链表

  • 多个元素组成的列表
  • 元素存储不连续,用next指针连在一起

数据结构-链表 - 图1

数组VS链表

  • 数组:增删非首尾元素时往往需要移动元素
  • 链表:增珊非首尾元素,不需要移动元素,只需要更改next指向即可

JS中的链表

  1. //用JS创建链表
  2. let a = {val:'a'};//a就是链表或者称为链表的头部
  3. let b = {val:'b'};
  4. let c = {val:'c'};
  5. let d = {val:'d'};
  6. a.next = b;
  7. b.next = c;
  8. c.next = d
  9. //遍历链表
  10. let point = a;
  11. while(p){
  12. console.log(p.val)
  13. p = p.next
  14. }
  15. //插入
  16. const e = {val:'e'};
  17. c.next = e;
  18. e.next = d;
  19. //删除
  20. c.next = d;

删除链表中的节点(未知链表,已知被删节点)

  1. //用JS创建链表
  2. let a = {val:'a'};//a就是链表或者称为链表的头部
  3. let b = {val:'b'};
  4. let c = {val:'c'};
  5. let d = {val:'d'};
  6. a.next = b;
  7. b.next = c;
  8. c.next = d
  9. //遍历链表
  10. let point = a;
  11. while(p){
  12. console.log(p.val)
  13. p = p.next
  14. }
  15. //插入
  16. const e = {val:'e'};
  17. c.next = e;
  18. e.next = d;
  19. //删除
  20. c.next = d;

反转链表

  1. //用JS创建链表
  2. let a = {val:'a'};//a就是链表或者称为链表的头部
  3. let b = {val:'b'};
  4. let c = {val:'c'};
  5. let d = {val:'d'};
  6. a.next = b;
  7. b.next = c;
  8. c.next = d
  9. function reverse(head){
  10. let p1 = head;
  11. let p2 = null;
  12. while(p1){
  13. const temp = p1.next;
  14. p1.next = p2;
  15. p2 = p1;
  16. p1 = temp;
  17. }
  18. return p2
  19. }
  20. let res = reverse(a);
  21. while(res){
  22. console.log(res);
  23. res =res.next
  24. }

两数相加

  1. //用JS创建链表
  2. let a = {val:7};//a就是链表或者称为链表的头部
  3. let b = {val:4};
  4. let c = {val:9};
  5. let a1 = {val:4};
  6. let b1 = {val:3};
  7. let c1 = {val:2};
  8. a.next = b;
  9. b.next = c;
  10. a1.next = b1;
  11. b1.next = c1;
  12. function add(head1,head2){
  13. let p1 = head1;
  14. let p2 = head2;
  15. let p3 = {val:0}
  16. let carrot = 0;
  17. while(p1 || p2){
  18. let val1 = p1.val? p1.val : 0;
  19. let val2 = p2.val? p2.val : 0;
  20. carrot = Math.floor((val1+val2)/10);
  21. let val = (val1+val2)%10+carrot;
  22. p3.val = val;
  23. p3.next={val:''};
  24. p3 = p3.next;
  25. p1 = p1.next;
  26. p2 = p2.next;
  27. }
  28. return p3
  29. }

原型链

本质是链表

原型链的节点是各种原型对象,比如Function.prototype,Object.prototype…

如果A沿着原型链能找到B.prototype那么A instanceof B就是true

如果在A对象上没有找到x属性会沿着原型链找x属性

  1. let obj = {};
  2. Object.prototype.x = 'x';
  3. console.log(obj.x); //x
  4. let func = function(){}
  5. console.log(func.x);

遍历原型链(手写 instanceof)

  1. const instanceOf = function(A,B){
  2. let p = A;
  3. while(p){
  4. if(p === B.prototype){
  5. return true
  6. }
  7. p = p.__proto__;
  8. }
  9. return false
  10. }
  11. instanceOf([],Array) //true
  12. instanceOf([],Object) //true

面试题

  1. let foo = {},F = function(){};
  2. Object.prototype.a = 'value a';
  3. Function.prototype.b = 'value b';
  4. console.log(foo.a);//value a
  5. console.log(foo.b);//undefined
  6. console.log(F.a);//value a
  7. console.log(F.b);//value b

指针遍历json

  1. const json = {
  2. a:{b:{c:1}},
  3. d:{e:2}
  4. }
  5. const path = ['d','e'];
  6. let p = json;
  7. path.forEach((k)=>{
  8. p = p[k];
  9. console.log(p)
  10. })