给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
思路:
计算链表长度num,num - n就是需要删去结点的索引
其中若删去第一个结点,返回head.next;
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
public class Solution {
public ListNode RemoveNthFromEnd(ListNode head, int n) {
int num = 0;
ListNode temp = head;
while(temp != null)
{
num++;
temp = temp.next;
}
int index = num - n;
if(index == 0)//第一个结点
return head.next;
temp = head;
for(int i = 1; i < index; i++)
temp = temp.next;
temp.next = temp.next.next;
return head;
}
}
复杂度分析
-
时间复杂度:O(sz),其中 sz 是链表的长度。最多需要遍历链表两次,删除结点的时间为 O(1)。
-
空间复杂度:O(1)。