数据链表之单链表实现
实现一个单链表及相关注释
1 function LinkList() { // 单链表 2 // 节点 3 let Node = function(element) { 4 this.element = element 5 this.next = null 6 } 7 8 // 初始头节点 9 let head = null 10 11 // 链表长度 12 let length = 0 13 14 // 操作 operation 15 this.getList = function() { // 获取列表 16 return head 17 } 18 // 思路:遍历单链表,判断节点值是否等于待查找值,相等则返回 true ,否则继续遍历下一个节点,直到遍历完整个链表还未找到,则返回 false 19 this.search = function(element) { // 查找节点 20 let p = head 21 if(!p) return false // 链表为null 直接返回false 22 while(p) { // 此时p为head首节点 23 if(p.element === element) return true //如果相等直接返回 true 24 p = p.next // 把p赋值为下一节点 25 } 26 return false // 遍历完了p最后等于null 表示没有直接返回false 27 } 28 // 思路:初始化一个节点(待追加节点),遍历到链尾,在尾节点后插入该节点 29 this.append = function(element) { // 追加节点 30 // 初始化一个节点,然后定义p为头节点 31 let node = new Node(element), p = head 32 if(!head) { 33 head = node // 如果头节点为空那添加这个节点就是头节点 34 } else { 35 while(p.next) {// 头结点不为空遍历头节点 36 p = p.next // 直到遍历最后一个节点为止,此时p为最后一个节点 37 } 38 p.next = node // 此时p已经是最后一个节点,然后将next指向新最加的节点,这样最后一个节点就是新最加的节点node了其next为空 39 } 40 length += 1 // 到此length +1 41 } 42 // 思路:初始化一个节点(待插入节点 node ),遍历到 position 前一个位置节点,在该节点后插入 node 43 this.insert = function(position, element) {// 特定位置插入节点 44 // 首先创建插入节点 45 let node = new Node(element) 46 if(position >= 0 && position <= length ) { // 小于0及超出边界的则直接返回null 47 //定义上一节点,当前节点,当前索引等初始化值 48 let prev = head, curr = head, index = 0 49 if(position === 0) { // 边界情况 如果插入的是第0个则直接插入 50 node.next = head 51 head = node 52 } else { 53 while(index < position) { 54 prev = curr // 交换位置上一节点为当前节点 55 curr = curr.next // 当前节点为 下一节点 56 index++ // 索引加1 57 } 58 // 当index等于position时 59 prev.next = node // 上一节点的next就是插入节点 60 node.next = curr // 插入节点替换了当前节点,插入节点的下一节点就是当前节点 61 } 62 length += 1 // 长度加1 (不管是在首节点还是其他位置插入节点长度+1) 63 } else { 64 return null 65 } 66 } 67 68 this.remove = function(element) { // 删除节点 69 if(!head) return //边界情况如果链表为空直接返回 70 let curr = head, prev = head 71 while(curr) { 72 if(curr.element === element) { // 找到节点 73 curr = curr.next // 当前节点等于当前节点的next节点 74 prev.next = curr // 上一节点的下节点等于当前节点 75 } else { // 没有找到的时候 76 prev = curr // 交换位置上一节点等于当前节点 77 curr = curr.next // 当前节点往后移等于next下一节点 78 } 79 } 80 } 81 82 this.isEmpty = function() { // 节点是否为空 83 return !head 84 } 85 86 this.size = function() { // 节点大小 87 return length 88 } 89 }