1、删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

单指针:

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @param {number} val
  11. * @return {ListNode}
  12. */
  13. var deleteNode = function(head, val) {
  14. if (!head) return head
  15. if (head.val === val) return head.next
  16. let p = head
  17. while (p.next) {
  18. if (p.next.val === val) {
  19. p.next = p.next.next
  20. break
  21. }
  22. p = p.next
  23. }
  24. return head
  25. };

双指针:

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @param {number} val
  11. * @return {ListNode}
  12. */
  13. var deleteNode = function(head, val) {
  14. if (!head) return head
  15. if (head.val === val) return head.next
  16. let pre = head, cur = head.next
  17. while (cur && cur.val !== val) {
  18. pre = cur
  19. cur = cur.next
  20. }
  21. if (cur) pre.next = cur.next
  22. return head
  23. };

2、环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。

普通解法:通过遍历链表,将每个节点存储起来,遍历时判断当前节点是否已经被缓存,如果被缓存则表示存在环

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {boolean}
  11. */
  12. var hasCycle = function(head) {
  13. const cache = new Set()
  14. while (head) {
  15. if (cache.has(head)) return true
  16. cache.add(head)
  17. head = head.next
  18. }
  19. return false
  20. };

解法2:通过双指针,设置不同的步长,遍历链表,如果存在环则两个指针一定会重叠:

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {boolean}
  11. */
  12. var hasCycle = function(head) {
  13. let slow = head, fast = head
  14. while (fast && fast.next) {
  15. fast = fast.next.next
  16. slow = slow.next
  17. if (fast === slow) return true
  18. }
  19. return false
  20. };