算法:链表

  • 237 删除链表中的节点
    先复制其他结点内容到当前结点,再删除其他结点,实现删除当前结点。
  • 19 删除链表的倒数第N个节点
    双指针法(链表):快指针先移动n+1位,慢指针再出发,然后快指针达到NULL位置时,慢指针就处于倒数第n+1个。
public ListNode removeNthFromEnd(ListNode head, int n) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    ListNode first = dummy;
    ListNode second = dummy;
    // Advances first pointer so that the gap between first and second is n nodes apart
    for (int i = 1; i <= n + 1; i++) {
        first = first.next;
    }
    // Move first to the end, maintaining the gap
    while (first != null) {
        first = first.next;
        second = second.next;
    }
    second.next = second.next.next;
    return dummy.next;
}
  • 206 反转链表
    迭代法:对每个结点做操作,一直迭代到尾结点。
    递归法:空链表或单结点链表跳出递归,递归当前结点的后续链表,将当前结点接在反转后的后续链表尾部,并设当前结点的next为NULL值。
public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) return head;
    ListNode p = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return p;
}
  • 234 回文链表
    双指针法(链表)II:快指针每次走两个结点,慢指针只走一个结点,最后快指针到达NULL位置时,慢指针就位于len/2的位置。
        ListNode fast = head;
        ListNode slow = head;
        // 根据快慢指针,找到链表的中点
        while(fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        slow = slow.next;
  • 2 两数相加
    当存在一方结点不足时,可以把该加数当作0。
  • 328 奇偶链表
    双链表法:将奇偶结点分别连成两个链表,然后再把偶链表接到奇链表之后。
  • 141 环形链表
    双指针法(奇偶指针)解决。
  • 160 相交链表
    转化为环形链表问题解决。
    计算两链表长度,截去多余结点后再平行比较。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容