/**
* 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。
* @author
* 首先要通过两个指针找到链表中的倒数第N个节点,思路:先找让指针p1向前移动n-1步,这时直到链表的结尾,p2,p1同步移动,p1到了尾部,p2指向的就是倒数n个节点了
* 同时要记录下p2前一个节点的位置,用来做链表的倒数第N个节点的删除工作。
*
*/
public class Solution {
/**
* @param head:
* The first node of linked list.
* @param n:
* An integer.
* @return: The head of linked list.
*/
ListNode removeNthFromEnd(ListNode head, int n) {
ListNode p1, p2, pre = null;
if (head == null || n <= 0) {
return null;
}
p1 = head;
p2 = head;
for (int i = 0; i < n - 1; i++) {
if (p1.next != null) {
p1 = p1.next;
} else {
return null;
}
}
while (p1.next != null) {
p1 = p1.next;
pre = p2;
p2 = p2.next;
}
if (p2 == head) {
head = head.next;
} else {
pre.next = pre.next.next;
}
return head;
}
@Test
public void test() {
ListNode list = new ListNode(1);
ListNode list1 = new ListNode(2);
ListNode list2 = new ListNode(3);
ListNode list3 = new ListNode(4);
ListNode list4 = new ListNode(5);
list.next = list1;
list1.next = list2;
list2.next = list3;
list3.next = list4;
ListNode an = removeNthFromEnd(list, 2);
String result = "";
while (an != null) {
result += String.valueOf(an.val) + "->";
an = an.next;
}
result = result.substring(0, result.length() - 2);
System.out.println(result);
}
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
}