[算法]删除链表的中间节点

Posted 小魔仙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]删除链表的中间节点相关的知识,希望对你有一定的参考价值。

题目一:

给定链表的头结点,实现删除链表中间节点的函数。

思路:

基本解法:

先遍历一遍链表,计算出链表节点的个数。然后计算出中间节点的位置,再次遍历链表,找到中间节点的前一个位置,进行删除操作。

但是也可以只遍历一次就完成上述操作:

链表的长度 中间节点 的位置
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4

可以看出,链表的长度每增加两个节点,中间节点的位置就向右移动一位。所以我们可以设置两个变量pre和cur,cur表示当前遍历的位置,pre表示从头结点到cur这段的中间节点的前一个节点的位置。在遍历链表的过程中,cur一次向右移动两个节点,那么pre就一次向右移动一个节点。当然,上述过程要注意判断cur.next及cur.next.next是否为空。当一次遍历完成后,cur指向最后一个节点或者倒数第二个节点,而pre指向整个链表中间节点的前一个节点的位置。

  public static class Node {
    public int value;
    public Node next;
    public Node(int data) {
      this.value = data;
    }
  }
  public static Node removeMidNode(Node head) {
    if (head == null || head.next == null) {
      return head;
    }
    if (head.next.next == null) {
      return head.next;
    }
    Node pre = head;
    Node cur = head.next.next;
    while (cur.next != null && cur.next.next != null) {
      pre = pre.next;
      cur = cur.next.next;
    }
    pre.next = pre.next.next;
    return head;
  

找到链表的中间节点是链表算法中十分常用。注意灵活应用。

以上是关于[算法]删除链表的中间节点的主要内容,如果未能解决你的问题,请参考以下文章

算法面试题 02.03. 删除中间节点

LeetCode 2095. 删除链表的中间节点

链表问题----删除链表的中间节点和a/b处的节点

删除链表的中间节点和a/b处的节点

力扣之删除中间节点

力扣之删除中间节点