这是一个比较典型的题,很多地方书籍都有出现。
第一个想到的方法也是最容易的方法当然是先遍历链表得到链表的长度为 length ,
那么倒数第 K 个元素 第 length - K写一个for 循环,即可找到 目标结点。但是这样
需要先遍历一次链表,再遍历到倒数第 K 个结点,比较慢。
比较好的方法是我们设置两个结点,一个firsNode结点从头结点开始先向前走 K-1个
结点,一个secNode结点等firstNode结点向前走了 K -1个结点后再开始向前走。当firstNode
结点到达链表的尾部时secNode则刚好到达倒数第 K 个结点。
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null)
return null;
else{
ListNode p=head;
ListNode q=head;
while(k>0&&p!=null){
p=p.next;
k--;
}
if(k>0&&p==null)
return null;
else{
while(p!=null){
p=p.next;
q=q.next;
}
return q;
}
}
}
链表的反转
//反转链表
public void reverseList(Node head){
Node preverseHead=head;
Node pNode=head;
Node pPre=null;
while(pNode!=null){
Node pNext=pNode.next;
if(pNext==null)
preverseHead=pNode;
pNode.next=pPre;
pPre=pNode;
pNode=pNext;
}
this.head=preverseHead;
}