一、一趟扫描实现删除链表倒数第n个节点
题目描述:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
二、代码实例
代码如下(示例):
/**
* Definition for singly-linked list.
* 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 Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//temp用来定位倒数第n个节点的上一个节点
ListNode temp = new ListNode();
temp.next = head;
if(head.next == null){
head = null;
return head;
}
//双指针,第一个指针先下n个,当第一个节点到末尾,第二个指针的位置,就是倒数第n个;
ListNode l1 = head;
ListNode l2 = head;
int index = 1;
while(index < n){
l1 = l1.next;
index ++;
}
while(l1.next != null){
l1 = l1.next;
l2 = l2.next;
temp =temp.next;
}
//此时l2就是倒数第n个;
//一趟扫描
//此时temp指向l2的上一个节点
if(l2.next != null){
temp.next = l2.next;
l2.next = null;
//如果l2 == head ,就是删除了第一个节点
if(l2 == head)
return temp.next;
return head;
}else{
//如果l2.next == null
//表示删除的是最后一个节点,直接将temp的next置为空
temp.next = null;
return head;
}
}
}