LeetCode 第十九题 Remove Nth Node From End of List

一,问题描述
1,删除一个单链表末尾开始算起的第n个结点,然后返回该单链表。
2,例如:
输入: 1->2->3->4->5 其中n=2;
输出: 1->2->3->5;
3,解题思路:
给定两个临时结点指向头结点head,设为p和q,先让p往前先走n个结点,然后p和q同步往前走,直到p的下一个节点为空集为止,那么q的下一个节点就是要被删除的节点。使用另外一个节点node,node=q.next。然后q.next=node.next。那么q的下一个节点就被删除了。返回头结点head。

二,AC了的程序(用Java写的)

import java.util.*;
class ListNode{   //定义一个结点,结点里有一个值和指向下一个结点的指针。
    int    val;
    ListNode next;
    ListNode(int x)
    {
        val=x;
    }
}
public class Test2{
    public static void main(String []args)
    {
        ListNode head=new ListNode(1);  //先给每个数建立一个结点,但是每个结点之间还没有连接起来。
        ListNode node2=new ListNode(2);
        ListNode node3=new ListNode(3);
        ListNode node4=new ListNode(4);
        ListNode node5=new ListNode(5);

        head.next=node2;      //这里开始对每个结点,相互连接起来,即,相邻的结点连接起来,最终形成一个单链表,头指针指向第一个结点。
        node2.next=node3;
        node3.next=node4;
        node4.next=node5;

        ListNode list=removeNthFromEnd(head,2);//这里的n,我给赋值为2,大家可以根据需求进行赋值的。
        ListNode node=list;
        while(node!=null)  //该部分对返回结果单链表,进行输出。
        {
            if(node.next!=null)
            {
                System.out.print(node.val+"->");
            }
            else
            {
                System.out.print(node.val);
            }
            node=node.next;
        }
    }

    public static ListNode removeNthFromEnd(ListNode head, int n)//这里是关键的函数部分
    {
        if(n==0||head==null)
        {
            return head;
        }
        if(n==1&&head==null)  //要是单链表为空的,但是要删除第1个结点,直接返回空的
        {
            return null;
        }
        ListNode p=head;      //均指向第一个结点
        ListNode q=head;      //均指向第一个结点

        for(int i=0;i<n;i++)  //先让p往前移动n个结点啊
        {
            if(p!=null)
            {
                p=p.next;
            }
            else
            {
                return head;
            }
        }

        if(p==null)   //这里考虑到单恋表的长度不足n,那么直接删除空集
        {
            head=head.next;
            return head;
        }

        while(p.next!=null)//p的下一个结点不为空,则p和q同时往前移动一个结点。
        {
            p=p.next;
            q=q.next;
        }
        ListNode node=q.next; //把q的下一个结点用一个变量node标记起来。
        q.next=node.next;  //这里把q的下一个结点删除了。
        return head;
    }
}

运行结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值