链表问题----删除链表的中间节点和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 等于0,不删除任何节点

  如果 r 在区间(0,1/5]上,删除节点 1

  如果 r 在区间(1/5,2/5]上,删除节点 2

  如果 r 在区间(2/5,3/5]上,删除节点 3

  如果 r 在区间(3/5,4/5]上,删除节点 4

  如果 r 在区间(4/5,1]上,删除节点 5

  如果 r 大于1,不删除任何节点

  

package com.test;

import com.tset.ListNode;

/**
 * Created by Demrystv.
 */
public class RemoveListNode {

    // 针对普通问题,采用的方法是找规律,当元素个数大于3时,链表长度每增加2,要删除的节点就要后移一个节点
    public ListNode removeMiddle(ListNode head){

        // 针对的是没有元素或者只有一个元素
        if (head == null || head.next == null){
            return null;
        }

        // 针对的是只有两个元素
        if (head.next.next == null){
            return head.next;
        }

        // 针对的是三个及三个以上元素,这时符合规律
        ListNode pre = head;
        ListNode cur = head.next.next;
        while (pre.next != null && cur.next.next != null){
            pre = pre.next;
            cur = cur.next.next;
        }
        pre.next = pre.next.next;
        return head;
    }

    // 针对进阶问题,主要是找到n,即要删除的元素的位置
    public ListNode removeByRatio(ListNode head, int a ,int b){
        if (a < 1 || a > b){
            return head;
        }

        // 求链表的长度
        int n = 0;
        ListNode cur = head;
        while (cur != null){
            n++;
            cur = cur.next;
        }

        // n表示要删除的节点是第几个节点,可以举例证明,也可以通过举例来推导
        n = (int) Math.ceil((double)(a * n) / (double) b);

        // 其原理类似于删除倒数第K 个节点
        if (n == 1){
            return head.next;
        }
        if (n > 1){
            cur = head;
            while (--n != 0){
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }
        return head;
    }

}

 

原文地址:https://www.cnblogs.com/Demrystv/p/9311318.html

时间: 2024-08-21 21:05:06

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

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

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

删除链表中间节点和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 = 0,不删除任何节点: 如

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:对于三个

剑指Offer(链表)-删除链表中重复的节点

(删除链表中重复的节点)题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路:这里的重复的节点不保留是将只要重复了的节点都要删除掉,所以考虑利用哈希set的方法,先进行重复性的判断,将重复的元素加入到哈希set中去,然后将重复的元素删除. 利用到了两个指针pre和cur,来表示前一个节点和当前节点. /* public

生成单向链表 并删除链表中某个元素

leetcode 题目描述: Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6 Return: 1 --> 2 --> 3 --> 4 --> 5 生成链表 若输入元素不为0,则加入到链表尾部,若为0,不加入,且生成链表工作完成.代

给定一个链表,删除链表的倒数第 n 个节点(已知该结点存在),并且返回链表的头结点。

思路: 找到倒数第n个结点的前一个结点,让该结点的后继为倒数第n个结点的后继 子问题:找到倒数第n个结点的前驱 1.有两个引用,第一个引用指向首节点,然后走n步 2.第二个结点指向首节点,此时两结点之间隔了n-1个结点,保持这样的距离,共同向后移动 3.当第一个引用到达尾节点时,第二个引用离尾节点有n-1个结点, 4.此时第二个结点为倒数第n+1个结点,即倒数第n个结点的前驱 特殊情况: 1.链表只有一个结点或者为空链表,直接返回空即可: 2.链表的长度刚好等于n,即删除首节点,第一个引用从头结

单链表之删除链表重复数据

1 public static void deleteDup(Node head){ 2 Node p = head; 3 while(p!=null){ 4 Node q = p; 5 while(q.next != null){ 6 if(p.data == q.next.data){ 7 q.next = q.next.next; 8 //不能加q = q.next; 9 }else{ 10 q = q.next; 11 } 12 } 13 p = p.next; 14 } 15 }

删除链表中倒数第n个节点

1.给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 挑战 O(n)时间复杂度 解题思路:刚开始看到倒数第n个节点,不禁感慨如果是数组就可以直接倒着来了.不过针对链表,一定要想起来最常用的方法---快慢指针.设一个fast和slow指针:快指针先走n步,然后快慢指针一起走,