题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路
- 定义两个节点nl和nr,初始值都是头结点,nr向右移动n次,然后nl和nr一起向右移动,直到nr的下一个节点为空,停止移动,此时nl节点对应的下一个节点就是需要删除的节点。
- 开始的时候要对输入进行非空校验,判断头结点是否有下一个节点,以及n是否为0。
- nr移动完成之后,为了防止n和链表的长度一样,即nr移动完成了就是空的,导致nr.next会抛出异常,需要进行一个nr是否为空的判断,如果为空,则直接删除头结点返回即可。笔者在第一次未有做判断,结果凉~~。
代码
public class Q019_removeNthFromEnd {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head.next == null || n == 0){
return null;
}
ListNode nl = head;
ListNode nr = head;
for(int i = 0; i < n; i++){
nr = nr.next;
}
if(nr == null) {
ListNode temp = head.next;
head.next = null;
return temp;
}
while(true){
if(nr.next == null){
ListNode temp = nl.next;
nl.next = temp.next;
temp.next = null;
return head;
}
nl = nl.next;
nr = nr.next;
}
}
}