您的位置:首页 > Web前端

剑指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;
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: