给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
来源:力扣(LeetCode)
解法一:
暴力遍历得到链表长度,在第二次遍历的过程中找到代删除的结点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode temp=head;
int size=1;
while(true){
if(temp.next==null){
break;
}size++;
temp=temp.next;
}
if(size==1&&n==1){
head=head.next;
return head;
}
int x=size-n;
ListNode l=head;
int sum=1;
while(true){
if(sum==x){
l.next=l.next.next;
break;
}
if(x==0){
head=head.next;
break;
}
if(l.next==null){
break;
}l=l.next;
sum++;
}
return head;
}
}
此解法时间复杂度为O(n)
但是需要遍历俩遍链表
解法二:
进阶版遍历一遍链表对节点进行删除
设置俩个节点指针,在遍历的过程中俩个指针保持着n-1个节点的距离
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode temp = new ListNode(0, head);
ListNode l = head;
ListNode s= = temp;
for (int i = 0; i < n; ++i) {
l = l.next;
}
while (first != null) {
l = l.next;
s = s.next;
}
s.next = s.next.next;//删除节点
ListNode h = temp.next;
return h;
}
}