删除链表的倒数第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


  
posted @ 2021-06-24 17:05  朝才  阅读(92)  评论(0编辑  收藏  举报