题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;
}
}