删除链表的倒数第N个节点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
- 进阶:你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
代码
/**
1. Definition for singly-linked list.
2. public class ListNode {
3. int val;
4. ListNode next;
5. ListNode() {}
6. ListNode(int val) { this.val = val; }
7. ListNode(int val, ListNode next) { this.val = val; this.next = next; }
8. }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head.next == null)//只有一个节点,删除后链表为空
return null;//直接返回null
if (n == getLength(head)) {//n等于链表长度
return head.next;//返回第二个节点的引用
}
//头节点head不能改变,创建一个辅助变量temp
ListNode temp = head;
for (int i = 0; i < getLength(head) - n - 1; i++){
temp = temp.next;//temp后移(链表长度-n-1)次
}
temp.next = temp.next.next;//删除节点temp.next
return head;//返回头节点
}
public int getLength(ListNode head) {
int count = 0;
ListNode temp = head;
while (true) {
if (temp == null)
break;
count++;
temp = temp.next;
}
return count;
}
}
要点:
- 对特殊情况特殊处理,特殊情况:只有一个节点、n等于链表长度
- 删除节点temp.next代码:temp.next = temp.next.next
来源:力扣(LeetCode)
链接:官方链接
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。