leetcde第十九题java解法——删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 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;  
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42882229/article/details/89762730