题干:
给你一个链表,删除链表的倒数第
n
个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?
示例:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
public class 删除链表的倒数第N个节点 {
public static void main(String[] args) {
int[] nums = {1};
int n = 1;
ListNode head = createList(nums);
ListNode ans = removeNthFromEnd(head,n);
while(ans!=null) {
System.out.println(ans.val);
ans = ans.next;
}
}
public static ListNode removeNthFromEnd(ListNode head, int n) {
ListNode l = head;
ListNode r = head;
for(int i=0;i<n;i++) {
r = r.next;
}
if(r==null) return head.next;
while(r.next!=null){
l = l.next;
r = r.next;
}
l.next = l.next.next;
return head;
}
public static class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val,ListNode next) { this.val = val; this.next = next; }
}
public static ListNode createList(int[] nums){
ListNode head = new ListNode();
ListNode point = head;
for(int i:nums){
ListNode newNode = new ListNode(i);
point.next= newNode;
point = newNode;
}
return head.next;
}
}
经过思考之后,想到先让r指针走n步,走完n步之后的r指针前一个结点就是需要删除的结点(例如,结点1,2,3,需要删除倒数第2个结点,也就是n=2,那么r指针走完n步后到达3这个结点,需要删除的即是前一个结点2)。
之后再判断r是否走到了最后一个结点的next(PS:null),如果走到了null,说明我们需要删除的是头节点(例如,结点1,2,需要删除倒数第2个结点,也就是n=2,那么r指针走完n步后到达null这个位置,需要删除的是头结点),返回头节点的next即可;如果没有走到null,就让l和r一起向前走,当r走到最后一个结点的时候,l所处结点是需要被删除结点的前一个结点。