- 我的思路:
- 利用栈
- 首先,遍历链表,将链表全部结点压入栈中
- 要删除倒数第n个结点,就应该找到倒数第n+1个结点,所以出栈n+1次即可
- 利用栈
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//首先,创建一个虚拟头结点
ListNode dummyHead = new ListNode(1,head);
Stack<ListNode> stack = new Stack<>();
ListNode temp = dummyHead;
while(temp!=null){
stack.push(temp);
temp = temp.next;
}
for(int i =1;i<=n+1;i++ ){
temp = stack.pop();
}
temp.next = temp.next.next;
return dummyHead.next;
}
}
- 但是效率很不理想
- 第二种思路:两次遍历
- 第一次遍历得出链表长度,然后就可以把倒数第n个改变为找正数,然后再遍历一次即可
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//首先,创建一个虚拟头结点
ListNode dummyHead = new ListNode(1,head);
ListNode temp = dummyHead;
int size = 0;
//获得链表长度,包含虚拟头结点
while(temp!=null){
size++;
temp = temp.next;
}
temp = dummyHead;
//倒数第n个,其实就是size-n+1,那么要删除第size-n+1个,就要找到size-n个
int i =1;
while(i!=size-n){
temp = temp.next;
i++;
}
temp.next = temp.next.next;
return dummyHead.next;
}
}