第19题:删除链表的倒数第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) {
ListNode dummy = new ListNode(0,head);
ListNode cur = dummy;
int len = 0;
while(head != null){
len++;
head = head.next;
//这里遍历必须要用head,因为cur和dummy会导致多加一个
}
for(int i = 1 ; i < len - n + 1 ; i++){
//这里需要注意i的取值,n个数字的倒数第x个就是正数第x-n+1个
//i从1开始数就是模拟正数第几个,并且cur需要停在第x-n+1之前
cur = cur.next;
}
cur.next = cur.next.next;
return dummy.next;
}
}
一趟遍历解法:(双指针)cur指针直接在head遍历时另一个指针保存head的前n个位置,当head走到最后一个结点时,cur走到倒数n个的前一个指针,在两趟解法的基础上小改一下就行。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0,head);
ListNode cur = dummy;
int len = 0;
while(head != null){
len++;
head = head.next;
if(len > n){
cur = cur.next;
}
}
cur.next = cur.next.next;
return dummy.next;
}
}