LeetCode第19题
/*
Remove Nth Node From End of List #
题目 #
Given a linked list, remove the n-th node from the end of list and return its head.
Example:
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
*/
import java.util.*;
// Definition for singly-linked list.
// 一个.java中一般是可以放多个类的,但是只能有一个用public修饰的类,
// 并且public 修饰的class 的名字需要和java文件的名字相同(区分大小写)
class ListNode {
// int val = 0;
// ListNode next = null;
// https://www.cnblogs.com/sgy614092725/p/shiguiyu21.html
int val;
ListNode next;
// 构造函数
ListNode(){}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public class RemoveNthNode{
public static void main(String[] args){
ListNode node01 = new ListNode(1);
ListNode node02 = new ListNode(2);
node01.next = node02;
ListNode node03 = new ListNode(3);
node02.next = node03;
ListNode node04 = new ListNode(4);
node03.next = node04;
ListNode node05 = new ListNode(5);
node04.next = node05;
RemoveNthNode rnn = new RemoveNthNode();
ListNode result = rnn.removeNthFromEnd(node01,2);
while (result != null){
System.out.println(result.val);
result = result.next;
}
}
// 第二个指针指向要删除节点的前一个地方
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode();
// 可以减少删除head节点特殊情况的判断
dummy.next = head;
// first.second初始状态为head节点之前的一个节点
// 这样的话,在删除第一个节点的时候也能获得其前一个节点
ListNode first = dummy;
ListNode second = dummy;
// first指向第n+2个节点,second指向第1个节点
// 即first比second快n+1
for (int i = 0; i <= n; i++) {
first = first.next;
}
// first指向倒数最后一个节点的后面一个节点,second指向倒数第n+1个节点
// 即first指向null的时候,second指向倒数第n+1个节点
while (first != null) {
first = first.next;
second = second.next;
}
// 倒数n+1个节点指向倒数n-1个节点,即删除倒数第n个节点
second.next = second.next.next;
return dummy.next;
}
}