给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
上面那句话说明了n是大于0且不会大于链表长度的值。
第一种解法思路:两次扫描。先获取链表的长度,在找到需要删除节点的前一个节点,直接跳过要删除的节点即可, pop.next=pop.next.next;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pop=new ListNode(0);
pop.next=head;
ListNode temp=head,res=pop;
int length=0;
while(temp!=null)//获取链表长度
{
temp=temp.next;
length++;
}
if(length==1)//因为n是大于0的,所以链表长度为一时,n只能是1,所以返回空
return null;
while(length-n>0)//找到需要删除节点的前一个节点
{
length--;
pop=pop.next;
}
pop.next=pop.next.next;//直接跳过要删除的节点
return res.next;
}
}
第二种解法思路:一次扫描。设定两个指针,一个为first,一个为last,先让last走到第n个节点,则两个指针相距为n,随后两指针一起移动,直到last到达最后一个节点,而此时的first.next就指向要删除的节点。于是,跳过即可 first.next=first.next.next;
还有一种情况,就是在让last移动n个节点后,last会为空,这种情况就是n个节点的链表要删除第n个节点,也就是删除第一个节点,遇到这种情况,直接返回head.next
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode first=head,last=head;
while(n>0)
{
n--;
last=last.next;
}
if(last==null)//要删除第一个节点
return head.next;
while(last.next!=null)
{
first=first.next;
last=last.next;
}
first.next=first.next.next;
return head;
}
}