0019

19. 删除链表的倒数第 N 个结点

题目

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

示例1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

方法一:常规想法

思路与代码

先遍历链表长度len,第len-n+1个数据就是我们要删除的。

 public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode pre = new ListNode(0,head);
        int len = getLength(head);
        ListNode cur = pre;
        for (int i=1; i < len - n + 1; ++i){
            //遍历到要删除的数据前一个
            cur = cur.next;
        }
        cur.next = cur.next.next;
        ListNode ans = pre.next;
        return ans;

    }
	//获取链表长度
    public int getLength(ListNode head) {
        int len = 0;
        while (head != null){
            ++len;
            head = head.next;
        }
        return len;
    }

方法二:快慢指针(双指针)

思路与代码

第一个指针和第二个指针都先指向头结点,第一个指针先移动n步,随后两个指针同时移动,直到第一个指针为空,这时候第二个指针指向的就是要删除的结点。

  public ListNode removeNthFromEnd(ListNode head, int n) {

        ListNode dummy = new ListNode(0,head);

        ListNode first = head;
        ListNode second = dummy;
        for(int i = 0; i < n; ++i){
            first = first.next;
        }
        while (first != null){
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
         
        return dummy.next;

    }
posted @ 2022-04-10 22:35  爱睡觉的卡比兽  阅读(211)  评论(0)    收藏  举报