解题思路:(C#)
方法简单,容易想到。首先遍历找到长度,再分成三种情况,首结点、尾结点和中间情况,每种情况只需要一次循环。注意return最好只有一个,否则Leetcode容易报错。
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode RemoveNthFromEnd(ListNode head, int n) {
int length=1;
ListNode temp=head;
while(temp.next!=null)
{
temp=temp.next;
length++;
}
if(n!=length && n!=1)
{
ListNode temp1=head;
for(int i=0;i<length-n-1;i++)
{
temp1=temp1.next;
}
temp1.next=temp1.next.next;
}
else if(n==length)
{
head=head.next;
}
else
{
ListNode temp3=head;
while(temp3.next.next!=null)
{
temp3=temp3.next;
}
temp3.next=null;
}
return head;
}
}
解题思路:(Cpp)
先循环遍历找到长度,再循环遍历删除。但是不推荐第二种方法,第一种比较好理解。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
int len=1;
ListNode* temp=head;
while(temp->next){
temp=temp->next;
len++;
}
if(n==len) return head->next; //如果是第一个,则直接返回head->next;
int m=len-n-1; //倒数第n个,就是从头开始第len-n+1个,但是我们要保存他的前一个数字,并且数字是从1开始的;这里减了一个2
ListNode* pre=head,* now=head->next;
while(m>0){
pre=pre->next;
now=now->next;
m--;
}
pre->next=now->next;
return head;
}
};