[LeetCode][java]删除链表的倒数第N个节点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NeptuneClouds/article/details/88372124

删除链表的倒数第N个节点

题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。

进阶:
你能尝试使用一趟扫描实现吗?

分析思路:
题目说用一次遍历完成,我们自然可以想到利用双指针来解题。

  1. 指针p指向头节点,然后让其向后移动n步。
  2. 指针q指向头结点,并和p一起向后移动。当p的next指针为null时,q即指向了要删除节点的前一个节点。
  3. 指针p的next指向要删除节点的下一个节点。
如果要删除的节点是首节点,那么p向后移动结束时会为null,需要加一个判断是否为null的条件。

java

/**
 * 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 p=head;
        ListNode q=head;
        for(int i=0;i<n;i++){
            p=p.next;
        }
        if(p==null){
            head=head.next;
            return head;
        }
        while(p.next!=null){
            p=p.next;
            q=q.next;
        }
        q.next=q.next.next;
        return head;
    }
}

猜你喜欢

转载自blog.csdn.net/NeptuneClouds/article/details/88372124