给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
思路:双指针法
需要用两个指针来帮助我们解题,pre和cur指针。首先cur指针先向前走N步,如果此时cur指向空,说明N为链表的长度,则需要移除的为首元素,那么此时我们返回head->next即可,如果cur存在,我们再继续往下走,此时pre指针也跟着走,直到cur为最后一个元素时停止,此时pre指向要移除元素的前一个元素,我们再修改指针跳过需要移除的元素即可。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = head;
ListNode cur = head;
for(int i = 0;i < n && cur != null; i++){//找到第n个结点
cur = cur.next;
}
if(cur == null){
return head.next;
}
// cur与pre相差n-1个结点
// 当cur.next为null,pre在倒数第n+1个位置
while(cur.next != null){
cur = cur.next;
pre = pre.next;
}
pre.next = pre.next.next;
return head;
}