LeetCode:19. Remove Nth Node From End of List(Medium)

1. 原题链接

https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/

2. 题目要求

给出一个链表,请删除倒数第n个结点并返回头节点

注意:给出的n总在合法范围内;只用一次遍历

3. 解题思路

删除倒数第n个结点,正着数即删除从表头结点开始的第L-n+1个结点。创建一个表头结点来指向头结点。

思路一:使用两次遍历。第一次遍历得到链表的长度,第二遍历删除第L-n+1个结点。

思路二:使用一次遍历。使用两个指针first和second,开始时first和second都指向头结点head。first指针先到达正数第n个结点,second指针不动。然后两个指针同步向后移动,保持两个指针之间的gap为n。当first.next==null时,second指针指向倒数第n个结点。

4. 代码实现

 

package com.huiAlex;

import java.util.List;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode(int x) { val = x; }
 * }
 */
public class RemoveNthNodeFromEndofList19 {
    public static void main(String[] args) {
        ListNode l1 = new ListNode(1);
        ListNode l2= new ListNode(2);
        ListNode l3 = new ListNode(3);
        ListNode l4= new ListNode(4);
        ListNode l5 = new ListNode(5);
        ListNode l6= new ListNode(6);
        l1.next=l2;
        l2.next =l3;
        l3.next=l4;
        l4.next=l5;
        l5.next=l6;

        ListNode ls = RemoveNthNodeFromEndofList19.removeNthFromEnd(l1,3);
        ListNode ls2 = l1.next.next.next;
        System.out.println("头结点:"+ls.val);   // Expected:1
        System.out.println("删除nth结点后,其前驱结点的后继结点"+ls2.val);  // Expected:5


    }
    // 思路二代码实现
    public static ListNode removeNthFromEnd(ListNode head, int n){
        ListNode headPointer = new ListNode(0);
        headPointer.next = head;
        ListNode first = head,second = head;

        for(int i =0;i<n+1;i++){ // first指针到达din个结点
            first=first.next;
        }

        while(first!=null){  // 保持gap为n,两个指针同步后移
            first=first.next;
            second=second.next;
        }
        second.next=second.next.next;  //删除倒数第n个结点

        return headPointer.next;

    }

    // 思路一代码实现
    public static ListNode removeNthFromEnd2(ListNode head, int n) {
        ListNode headPointer = new ListNode(0);
        headPointer.next = head;
        ListNode first = head;
        int length = 0;
        while (first != null) {  // 第一次遍历得到链表的长度
            length++;
            first = first.next;
        }
        length -= n;  // 倒数第n个结点前面所有结点的长度
        first = headPointer;
        while (length > 0) {  // 第二次遍历找到倒数第n个结点
            length--;
            first = first.next;
        }
        first.next = first.next.next;  // 删除倒数第n个结点
        return headPointer.next;
    }

    public static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

}

  

posted @ 2017-12-24 10:03  一只敲码的猫  阅读(194)  评论(0编辑  收藏  举报