zoukankan      html  css  js  c++  java
  • 删除链表的倒数第N个节点

    题目:

      给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

    思路:

      (一)分四种情况,效率较低  用数组

        将数据放入List 集合 进行判断

        1 list 只有一条数据,直接让头指针指向空

        2 删除数据为   倒数第一个 , 就让倒数第一个node 的 前一个 node.next  = null

        3 删除数据为   倒数最后一个  就让返回的头指针  指向head.next;

        4 剩下的就是  求出要删除的前一个node 指向 要删除的node 的下一个node

      (二)双指针

         保存一份头指针 temphead

        1 先遍历一遍 如果n == 节点数量 ,就返回 tempheadtemphead.next;

        2 如果不相等,则再从头开始遍历到删除节点前的那个节点,让他head.next = head.next.next 返回存储的头指针


    (一) 代码 暴力 枚举

    class Solution {
        public ListNode removeNthFromEnd(ListNode head, int n) {
            if(head == null){
                return head;
            }
            //保存头指针
            ListNode temphead = head;
            //存储list
            List<ListNode> list = new ArrayList<>();
            while(head != null){
                list.add(head);
                head = head.next;
            }
            //分四种情况 效率较低
            //1 只有一条数据,直接返回空
            //2 删除数据为 倒数第一个,就让倒数第一个的node 的 前一个node.next = null
            //3 删除数据为 倒数最后一个,就让返回的头指针 指向head.next
            //4 省下的就是   求出要删除的前一个node 指向 要删除的node 的下一个node
            if(list.size() == 1){
                temphead = null;
            }else if(n == 1){
                ListNode prenode = list.get(list.size() - 2);
                prenode.next = null;
            }else if(list.size() == n){
                temphead = temphead.next;
            }else{
                ListNode prenode = list.get(list.size() - n - 1);
                ListNode nextnode = list.get(list.size() - n + 1);
                prenode.next = nextnode;
            }
            return temphead;
        }
    }

    (二) 双指针

    class Solution {
        public ListNode removeNthFromEnd(ListNode head, int n) {
            if(head == null){
                return head;
            }
            //保存头指针
            ListNode temphead = head;
            int count = 0;
            while(head != null){
                count++;
                head = head.next;
            }
            if(count == n){
                return temphead.next;
            }
    
            //倒数,改成正数第几个
            n = count - n;
            count = 1;  //注意这里,从一开始
            head = temphead;
            while(head != null){
                if(count == n){
                    //让下一个 指向下下一个
                    head.next = head.next.next;
                    //返回头指针
                    return temphead;
                }else{
                    //向后移动指针
                    count++;
                    head = head.next;
                }
            }
            return temphead;
        }
    }

      





            
              JVM


      
  • 相关阅读:
    Leetcode 33.搜索旋转排序数组
    Leetcode 32.最长有效括号
    Leetcode 31.下一个排列
    Leetcode 30.与所有单词相关联的子串
    Leetcode 25.k个一组翻转链表
    Leetcode 24.两两交换链表中的节点
    做数据分析需要“搞”人?
    求职互联网数据分析,如何准备行业知识?
    如何利用Social Listening从社会化媒体中“提炼”有价值的信息?
    运营实操|如何利用微信后台数据优化微信运营
  • 原文地址:https://www.cnblogs.com/misscai/p/14927690.html
Copyright © 2011-2022 走看看