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

题目一:

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

思路:

基本解法:

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

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

链表的长度 中间节点 的位置
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;
  

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

时间: 2024-10-10 12:16:41

[算法]删除链表的中间节点的相关文章

算法总结之 删除链表的中间节点和a/b处的节点(链表中间节点的重要思想)

给定链表的表头节点head,实现删除链表的中间节点的函数 推展: 给定链表的头节点,整数a 和 整数 b,实现删除a/b处节点的函数 先来分析原问题, 长度1  直接返回 长度2 将头节点删除 长度3 删除第二个  长度4 删除第二个  长度5 删除第三个......长度每增加2 删除的节点就向后移动一个节点 如果要删除一个节点,则需要找到待删除节点的前一个节点 package TT; public class Test87 { public class Node{ public int val

LeetCode237 删除链表中的节点

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 -> 9 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2: 输入: head = [4,5,1,9], node = 1 输

图解精选 TOP 面试题 001 | LeetCode 237. 删除链表中的节点

题目描述 原题链接 LeetCode 237. 删除链表中的节点:https://leetcode-cn.com/problems/delete-node-in-a-linked-list 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 head =?[4,5,1,9],它可以表示为: 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 ?5? 的第二个节点,那么在调

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

删除链表的中间节点和a/b处的节点 对于给定一个链表的头节点head,实现删除链表的中间节点的函数. 例如 不删除任何节点: 1->2,删除节点1 1->2->3,删除节点2 1->2->3->4,删除节点2 1->2->3->4->5,删除节点3 如果将本问题复杂一下,给定链表的头节点head.整数a和整数b,实现删除位于a/b处节点的函数. 例如 链表:1->2->3->4->5,假设 a/b 的值为r 如果 r 等于

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

题目:给定链表的头结点head,实现删除链表的中间节点的函数 例如: 1,不删除任何节点: 1 --> 2,删除节点1: 1 --> 2 --> 3,删除节点2: 1 --> 2 --> 3 --> 4,删除节点2: 1 --> 2 --> 3 --> 4 --> 5,删除节点3: 进阶: 给定链表的头节点head,整数a和b, 实现删除位于a/b处节点的函数 例如: 链表: 1 --> 2 --> 3 --> 4 -->

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

问题描述: 给定链表的头结点head,实现删除链表的中间节点的函数: 例如: 不删除任何节点: 1-->2,删除节点1: 1-->2-->3,删除节点2 1-->2-->3-->4,删除节点2: 1-->2-->3-->4-->5,删除节点3: 分析及解题思路: 对于删除链表中的中间节点而言,当节点数增加2时,要删除的中间节点向后移一位.比如,首先链表中没有节点或节点为1个时,直接返回头结点:当节点数为2个时,直接返回head.next:对于三个

LeetCode237_Delete Node in a Linked List(删除链表中的节点) Java题解

题目: Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -

删除链表中的节点

1.删除链表中等于给定值 val 的所有节点. class Solution { public: ListNode* removeElements(ListNode* head, int val) { ListNode*newHead=new ListNode(-1); ListNode*pre=newHead; pre->next=head; while(pre->next!=NULL){ ListNode*cur=pre->next; if(cur->val==val){ pr

【leetcode 简单】 第六十九题 删除链表中的节点

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 -> 9 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2: 输入: head = [4,5,1,9], node = 1 输