题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
思路一:
使用双指针进行遍历
除掉倒数第n个链表
1.先让第一个指针遍历n次
2.在让第二个指针从头开始
与第一个指针的位置一样开始遍历到结束即可
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next=head;
ListNode first = head;
ListNode second = dummy;
for (int i = 0; i < n; ++i) {
first = first.next;
}
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
}
}
思路二:
遍历链表算出链表长度
在倒数第n个长度cur.next=cur.next.next;即可
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next=head;
ListNode cur=dummy;
int length=0;
while(head!=null){
length++;
head=head.next;
}
for(int i=0;i<length-n;i++){
cur=cur.next;
}
cur.next=cur.next.next;
return dummy.next;
}
}
由于cur是在第0个值即第0个节点
即for循环是for(int i=0;i<length-n;i++)
或者可以为for(int i=1;i<length-n+1;i++)
思路三:
栈通过先进后出的特点
先将所有链表同时入栈,在出栈链表中倒数第n个链表
最后一个栈顶元素就是前驱节点,链接回去即可
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0, head);
Deque<ListNode> stack = new LinkedList<ListNode>();
ListNode cur = dummy;
while (cur != null) {
stack.push(cur);
cur = cur.next;
}
for (int i = 0; i < n; ++i) {
stack.pop();
}
ListNode prev = stack.peek();
prev.next = prev.next.next;
return dummy.next;
}
}
栈的入栈出栈函数以及如何使用的用法
详细可查看我写过的文章
java中栈stack和队列queue用法详细分析(全)