与链表有关的几道编程题-java实现
来源:互联网 发布:js判断小数点后的位数 编辑:程序博客网 时间:2024/06/05 08:10
(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; }}
0 0
- 与链表有关的几道编程题-java实现
- 有关几种排序算法的改写(JAVA实现)
- 剑指offer中 与链表有关的编程练习题 Java编码
- 几道有关字符串处理的编程题(华硕,盛大招聘笔试题)
- 几道java编程题
- 与电容有关的几点解惑
- 有关字符串的两道编程题
- 几道有意思的java编程题目
- 与java有关的东东
- MFC有关菜单的编程实现
- 有关Java虚拟机与Java被称为‘平台无关的编程语言’的简单特点
- 黑马程序员——解4道与 NSArray、NSString 知识点有关的编程题
- 一些与C#编程有关的网址
- 与windows编程有关的重要概念
- 几道有关图的练习题
- java几道笔试编程题
- 有关网站UI实现的几种方式的讨论
- 有关网站UI实现的几种方式的讨论
- popwindow setFocusable(false) 不消失与弹出软键盘的冰火不容的矛盾
- WebView与JS交互
- hive笔记
- TTL time to live
- mySql存储过程
- 与链表有关的几道编程题-java实现
- h264 NAL头解析
- 简要说说k-means 聚类的过程
- DMA设备驱动(二)————dma和cache一致性(dma_malloc_writecombine)
- 初学python类
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- 冒泡排序
- jQuery 滚动到指定位置触发动画
- 实验:Android案例——商品展示