刷力扣题
问题描述:
给你一个链表,删除链表的倒数第 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]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
解法一:
- 先遍历一下链表记录节点个数n
- 查找倒数第n的前一个节点,将其next指向其next的next节点
- 检查如果要删除的倒数第n个,则头节点下移,并返回头节点
public ListNode removeNthFromEnd(ListNode head, int n) {
//先遍历一下链表记录节点个数n
int nodeSum=0;
ListNode p=head;
while(p!=null) {
nodeSum++;
p=p.next;
}
ListNode pp=head;
//检查如果要删除的倒数第n个,则头节点下移,并返回头节点
if(nodeSum==n) {
head=pp.next;
return head;
}
while(pp!=null) {
//查找倒数第n的前一个节点,将其next指向其next的next节点
if(nodeSum==n+1) {
pp.next=pp.next.next;
return head;
}
pp=pp.next;
nodeSum--;
}
return null;
}
}
运行结果
测试`
//main方法 链表【1,2,3,4,5】
public static void main(String[] args) {
ListNode head=new ListNode(1);
ListNode n1=new ListNode(2);
ListNode n2=new ListNode(3);
ListNode n3=new ListNode(4);
ListNode n4=new ListNode(5);
head.next=n1;
n1.next=n2;
n2.next=n3;
n3.next=n4;
ListNode removeNthFromEnd = removeNthFromEnd(head, 1);
//遍历结果链表
while(removeNthFromEnd!=null) {
System.out.println(removeNthFromEnd.val);
removeNthFromEnd=removeNthFromEnd.next;
}
}
//节点类
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
//输出
---------------------------------------------------
1
2
3
4
--------------------------------------------------