java程序员面试金典 2

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

public class ListNode{
     int val;
     ListNode next=null;
     ListNode(int val){
          this.val=val;
     }
}


public class Solution{
    public ListNode findKthToTail(ListNode head,int k){
        if(head==null || k<=0)  //判断传入头节点和K值是否符合要求
            return null;
       ListNode curNode=head;   //定义两个节点
        ListNode preNode=head;
        for(int i=1;i<k;i++){      //前面那个节点移动k-1步   需要注意:判断下一节点是否为空
           if(curNode.next!=null){   
              curNode=curNode.next;
           }else{    
              return null; 
           }
        }
        while(curNode .next!=null){  //当前面节点下一节点不为空时 两个节点继续右移 直到前面节点为空
           curNode=curNode.next;
           preNode=preNode.next;
        }
        return preNode;  //
       }
  }

2 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。

//分割链表  新增大小两个链表  最后合起来即可
public ListNode partition(ListNode pHead,int x){
   if(pHead ==null || pHead.next==null){   //若头节点为空或者只有一个节点时返回该节点
          return pHead;
   }

    ListNode curNode=pHead;  //当前节点
    ListNode   smallNode=new ListNode(-1);  //新建小链表的头节点
    ListNode   bigNode=new ListNode(-1);    //新建大链表的头节点
    ListNode   sNode=smallNode;       //记录小链表头节点的位置   便于后期返回头节点
    ListNode   bNode=bigNode;   //记录大链表的头节点位置   便于后期合并


    while( curNode!=null){   //当前节点不为空时
         if(curNode.val>=x){    //判断当前节点值与给定值的大小  从而分配链表
               bigNode.next=curNode;    //大值分配给bigNode  并向后移动
               bigNode=bigNode.next;
          }else{
                smallNode.next=curNode;  //小值分配给smallNode  并向右移动
                smallNode=smallNode.next;
           } 
           curNode=curNode.next;   // 分配完毕  继续移动到下一节点  重复分配动作
      }
      
     // 分配完毕  开始连接两个链表
    smallNode.next=bNode.next;  //小链表的尾节点的下一节点  连接到  大链表的头节点
    bigNode.next=null;  // 大 链表的尾节点 下一节点为null值
       
    return sNode.next;  //返回小 链表的头节点
} 

另外的一种思路: 用ArrayList把数据提取出来   然后再创建链表 把数据存进去

public static ListNode pertition(ListNode pHead,int x){
   ArrayList<Integer> less=new ArrayList<Integer>();
   ArrayList<Integer> eq=new ArrayList<Integer> ();
   ArrayList<Integer>  more=new ArrayList<Integer>();

   while(pHead!=null){
     if(pHead.val==x){
         eq.add(pHead.val);
     }else if( pHead.val>x){
         more.add(pHead.val);
     }else{
         less.add(pHead.val);
     }
    pHead=pHead.next;
   }
   
    less.addAll(more); //将more追加到less末尾
    less.addAll(eq);
    //现在所有数据均按照从小到大的顺序存在less集合中
    //重新创建链表  一个个节点开始创建
    pHead=null;
    ListNode p=null;
    for(Integer a:less){
       if(pHead==null){
           p=pHead=new ListNode(a);
       }else{
           p.next=new ListNode(a);
           p=p.next;
       }
     }
    return pHead;
}
    
  
     
   


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值