版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NeptuneClouds/article/details/88372124
删除链表的倒数第N个节点
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
分析思路:
题目说用一次遍历完成,我们自然可以想到利用双指针来解题。
- 指针p指向头节点,然后让其向后移动n步。
- 指针q指向头结点,并和p一起向后移动。当p的next指针为
null
时,q即指向了要删除节点的前一个节点。 - 指针p的next指向要删除节点的下一个节点。
如果要删除的节点是首节点,那么p向后移动结束时会为null,需要加一个判断是否为null的条件。
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode p=head;
ListNode q=head;
for(int i=0;i<n;i++){
p=p.next;
}
if(p==null){
head=head.next;
return head;
}
while(p.next!=null){
p=p.next;
q=q.next;
}
q.next=q.next.next;
return head;
}
}