剑指offer--关于链表操作的算法
2018-03-20 15:43
405 查看
题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;
}
}
相关文章推荐
- 剑指offer关于链表的一些操作(java)
- 【数据结构|剑指Offer】单向链表的各项操作实现
- JAVA中关于链表的操作和基本算法
- 剑指offer 算法(链表 树)
- JAVA中关于链表的操作和基本算法
- [剑指offer]算法3 链表
- JAVA中关于链表的操作和基本算法
- 剑指offer-算法题练习:part17 反转链表
- 链表常见操作【整理自剑指offer及csdn】
- 剑指offer-算法题练习:part16 链表中倒数第k个结点
- JAVA中关于链表的操作和基本算法
- JAVA中关于链表的操作和基本算法
- JAVA中关于链表的操作和基本算法
- 剑指offer:链表的操作
- JAVA中关于链表的操作和基本算法
- JAVA中关于链表的操作和基本算法
- 剑指Offer 链表相关算法
- 剑指offer-算法题练习:part18 合并两个排序的链表
- 单链表中的常见算法问题(剑指offer5/13/15/16/17)
- 剑指offer--面试题13:在O(1)时间删除链表结点--Java实现