剑指offer--关于链表操作的算法

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

思路1:


因为我们拿到的是第一个结点,不知道最后一个结点在哪。但是我们可以发现,从第一个结点走到倒数第K个结点的长度和正着第k个结点到最后一个结点的长度一样。所以我们可以用两个指针指向第一个结点,让第一个指证先走k-1步,然后两个指证一起走,这样,第一个指针走到底的时候,第二个指针也走到了倒数第k个结点。

思路2:直接用一个count计数,进入while循环,只要head.next不为空,count++。这样就直接得出链表的长度。然后从head结点走count-k步就到达倒数第k个位置。

代码:

 public ListNode FindKthToTail(ListNode head,int k) {
       if(head==null||k<=0){
            return null;
        }
        ListNode pre=head;
        ListNode last=head;       
        for(int i=1;i<k;i++){
            if(pre.next!=null){
                pre=pre.next;
            }else{
                return null;
            }
        }
        while(pre.next!=null){
            pre = pre.next;
            last=last.next;
        }
        return last;
    }



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

思路:反转链表,那么第一步head结点将指向一个空结点Pre,那为了保证head后面的链表不会断掉,第二步要用一个结点来代替原来的head,假设为last,第三步last.next在指向原来的head结点。第四步,pre指向head,head指向last,依次后移,将链表反转。


代码:

public ListNode ReverseList(ListNode head) {
        ListNode pre=null;
        ListNode next=null;
        if(head==null)
            return null;
        while(head!=null)
        {
        
    next=head.next;
            head.next=pre;
            pre=head;
            head=next;
        }
        return pre;
    }

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


思路:使用递归,我们可以看一个例子   { 1,3,5 }{2,4,6}第一个链表中的第一个数字和

public ListNode Merge(ListNode list1,ListNode list2) {
       if(list1 == null){
           return list2;//如果list1为空了,返回list2。
       }
       if(list2 == null){
           return list1;//如果list2为空,返回List1
       }
       if(list1.val <= list2.val){//如果List1的值小于list2的值
           list1.next = Merge(list1.next, list2);//比较list1.next和list2的大小,复制给next。
           return list1;//返回List1.
       }else{
           list2.next = Merge(list1, list2.next);//如果大于,返回List2为开始结点,继续比较List2,next和list1的大小
           return list2;
       }       
   }


        


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值