一 题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
二 解题思路
1.由于只能一次遍历,且题目给的链表是属于单向链表,不可逆向,所以只能通过双指针的思想进行检索
2.首先我们应该先找出要移除的节点,判断该节点是否为空,为空,证明我只要移除栈顶的节点即可,如果不为空,则开始构建第二个指针指向栈顶,此时同步移动这两个指针,直到第一个指针为空,证明已经到达栈底,而此时的另一个指针指向刚好在移除的节点,这时候只要将该指向指向下一个节点,就达到移除作用
三 代码实战
public static class ListNode {
int val;
ListNode next;
public ListNode(int x){
val = x;
}
}
public static ListNode removeNthFromEnd(ListNode head, int n) {
if(head==null){
return null;
}
ListNode preListNode = head;
for (int i =0;i<n;i++){
preListNode = preListNode.next;
}
if(preListNode==null){
head=head.next;
return head;
}
ListNode curListNode = head;
while(preListNode.next!=null){
preListNode=preListNode.next;
curListNode = curListNode.next;
}
curListNode.next = curListNode.next.next;
return head;
}