1、删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
单指针:
/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*//*** @param {ListNode} head* @param {number} val* @return {ListNode}*/var deleteNode = function(head, val) {if (!head) return headif (head.val === val) return head.nextlet p = headwhile (p.next) {if (p.next.val === val) {p.next = p.next.nextbreak}p = p.next}return head};
双指针:
/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*//*** @param {ListNode} head* @param {number} val* @return {ListNode}*/var deleteNode = function(head, val) {if (!head) return headif (head.val === val) return head.nextlet pre = head, cur = head.nextwhile (cur && cur.val !== val) {pre = curcur = cur.next}if (cur) pre.next = cur.nextreturn head};
2、环形链表
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
普通解法:通过遍历链表,将每个节点存储起来,遍历时判断当前节点是否已经被缓存,如果被缓存则表示存在环
/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*//*** @param {ListNode} head* @return {boolean}*/var hasCycle = function(head) {const cache = new Set()while (head) {if (cache.has(head)) return truecache.add(head)head = head.next}return false};
解法2:通过双指针,设置不同的步长,遍历链表,如果存在环则两个指针一定会重叠:
/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*//*** @param {ListNode} head* @return {boolean}*/var hasCycle = function(head) {let slow = head, fast = headwhile (fast && fast.next) {fast = fast.next.nextslow = slow.nextif (fast === slow) return true}return false};
