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

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

/**
 * @author :xxx
 * @description:TODO
 * @date :2020/10/18 16:29
 */
public class ListNode {
     int val;
     ListNode next;
     ListNode() {}
     ListNode(int val) { this.val = val; }
     ListNode(int val, ListNode next){
         this.val = val; this.next = next;
     }

}

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

    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode temp = new ListNode(0, head);
        ListNode cur = temp;
        int len = getLength(head);
//        System.out.println("链表的长度为"+len);
        for (int i = 0; i < len - n ; i++) {//此处n的长度为个坑
            cur = cur.next;
//            System.out.println("cur的内容:"+cur.val);
        }
        cur.next = cur.next.next;
        return temp.next;

    }

    public static void main(String[] args) {
        ListNode a = new ListNode(1);
        ListNode b = a;
        for (int i = 2; i <= 5; i++) {
            b.next = new ListNode(i);
            b = b.next;

        }
//        ListNode c = a;
//        while (c != null) {
//            System.out.println(c.val);
//            c = c.next;
//        }
        Solutions s1 = new Solutions();
        ListNode l = s1.removeNthFromEnd(a, 2);
        while (l!= null) {
            System.out.println(l.val);
            l = l.next;

        }

    }
}

 

posted @ 2020-10-18 19:45  进击的小渣渣!!  阅读(79)  评论(0)    收藏  举报