与链表有关的几道编程题-java实现

这篇博客介绍了如何使用Java解决链表的三个经典问题:找出链表中倒数第k个节点、反转整个链表以及合并两个单调递增的链表。详细讲解了每种操作的算法实现,并确保合并后的链表保持单调不减的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)输入一个链表,输出该链表中倒数第k个结点。


class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
public class Solution
{
    public ListNode FindKthToTail(ListNode head,int k) 
    {
        //这道题的难点在于不知道k结点的位置。怎么办呢
        //我们可以使用两个指针,第一个指针先跑k-1 ,然后两个指针再一起跑
        //等到第一个指针到终点时,第二个指针距终点也就是倒数第k个结点

        ListNode  pointer1 = null ,pointer2 =null;
        pointer1 = head;//起点为头指针
        pointer2 = head; //起点为头指针

       //记录k值
        int a=k;
        //记录节点的个数
        int count=0;
        //p指针先跑,并且记录节点数,当p指针跑了k-1个节点后,pre指针开始跑,
        //当p指针跑到最后时,pre所指指针就是倒数第k个节点
        while(pointer1 != null){
            pointer1 = pointer1.next;
            count++;

            if(k<1) //说明pointer1多跑了k-1步
            {
                pointer2 = pointer2.next; //此时pointer2可以跑了
            }
            k--; //pointer1每跑一步,就要讲k减去1
        }
        //如果节点个数小于所求的倒数第k个节点,则返回空
        if(count <  a)       return null;
        return pointer2;


    }
}

(2)输入一个链表,反转链表后,输出链表的所有元素。


class ListNode 
{
    int val;
    ListNode next = null;

    ListNode(int val) 
    {
        this.val = val;
    }
}


public class Solution 
{
    public ListNode ReverseList(ListNode head) 
    {
        if(head==null)
            return null;
        //head为当前节点,如果当前节点为空的话,那就什么也不做,直接返回null;
        ListNode pre = null;
        ListNode next = null;
        //当前节点是head,pre为当前节点的前一节点,next为当前节点的下一节点
        //需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head   next1->next2
        //即pre让节点可以反转所指方向,但反转之后如果不用next节点保存next1节点的话,此单链表就此断开了
        //所以需要用到pre和next两个节点
        //1->2->3->4->5
        //1<-2<-3 4->5
        while(head!=null){
            //做循环,如果当前节点不为空的话,始终执行此循环,此循环的目的就是让当前节点从指向next到指向pre
            //如此就可以做到反转链表的效果
            //先用next保存head的下一个节点的信息,保证单链表不会因为失去head节点的原next节点而就此断裂
            next = head.next;
            //保存完next,就可以让head从指向next变成指向pre了,代码如下
            head.next = pre;
            //head指向pre后,就继续依次反转下一个节点
            //让pre,head,next依次向后移动一个节点,继续下一次的指针反转
            pre = head;
            head = next;
        }
        //如果head为null的时候,pre就为最后一个节点了,但是链表已经反转完毕,pre就是反转后链表的第一个节点
        //直接输出pre就是我们想要得到的反转后的链表
        return pre;

    }
}

(3)输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

 class ListNode 
{
    int val;
    ListNode next = null;

    ListNode(int val) 
    {
        this.val = val;
    }
}
public class Solution
{
    public ListNode Merge(ListNode list1,ListNode list2)
    {
        ListNode  newlist;
        if(list1 == null)
            return list2;
        if(list2 == null)
            return list1;

        if(list1.val < list2.val)
        {
          newlist = list1;
          newlist.next  =  Merge(list1.next,list2);
        }
        else
            {
            newlist = list2;
            newlist.next = Merge(list1,list2.next);
        }

        return newlist;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值