刷题12: 删除链表的倒数第 N 个结点
Posted 嗯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题12: 删除链表的倒数第 N 个结点相关的知识,希望对你有一定的参考价值。
Leetcode:19. 删除链表的倒数第 N 个结点
1.双指针法
首先设置一个虚拟头节点pre,目的是当删除的元素是第一个时,用pre头节点删除第一个节点操作很方便。指针first和second开始都指向虚拟头节点pre。然后将second向后移动n+1个节点,这样first和second就有n+1个节点。first和second指针每次往后移动一个节点,这样当second指向链表尾部null时,first指针此时的位置为倒数第n+1个节点,因此first.next = first.next.next就删除了倒数第n个节点,最后返回pre.next即可。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(n <= 0) return null;
ListNode pre = new ListNode(-1,head);
ListNode first = pre,second = pre;
for(int i = 0;i <= n;i++){
if(second == null) return null;
second = second.next;
}
while(second != null){
first = first.next;
second = second.next;
}
first.next = first.next.next;
return pre.next;
}
2.栈
设置一个虚拟头节点pre,目的是当删除的元素是第一个时,用pre头节点删除第一个节点操作很方便.将所有节点从头到尾全部压进栈中,包括虚拟头节点。然后从栈中弹出n个节点,弹出n个节点后栈顶的元素就是n的前一个节点,假设为preNode,将preNode.next = preNode.next.next,最后返回pre.next即可。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(n <= 0) return null;
ListNode pre = new ListNode(-1,head),temp = pre;
Stack<ListNode> st = new Stack<>();
while(temp != null){
st.push(temp);
temp = temp.next;
}
for(int i = 0;i < n && st.isEmpty() != true;i++){
st.pop();
}
if(st.isEmpty()) return null;
ListNode preNode = st.peek();
preNode.next = preNode.next.next;
return pre.next;
}
}
以上是关于刷题12: 删除链表的倒数第 N 个结点的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Java刷题笔记—19. 删除链表的倒数第 N 个结点
Leetcode刷题100天—19. 删除链表的倒数第 N 个结点(双指针)—day21