问题,
输入一个链表,输出该链表中倒数第k个结点。
如果该链表长度小于k,请返回空。
第一种方法,直接遍历全部链接节点,并得出链表的总长度,这样便可以将倒数第K个节点转换为正向第N个节点,但是这种解法并不优雅,代码如下
public static ListNode firstFindKthToTail (ListNode pHead, int k) {
// write code here
if(k < 0 || null == pHead ){
return null;
}
int i = 1;
ListNode indexListNode = pHead.next;
while (null != indexListNode){
indexListNode = indexListNode.next;
i ++;
}
if(k > i){
return null;
}
int index = i - k;
i = 0;
while (pHead != null){
if(i == index){
return pHead;
}
i++;
pHead = pHead.next;
}
return null;
}
第二种方法,定义两个指针,前指针和后指针相距k个节点,当后指针到达根节点的时候,此时前指针的位置就是k节点的位置。
public static ListNode secondFindKthToTail (ListNode pHead, int k) {
if(k < 0 || null == pHead ){
return null;
}
ListNode bHead = pHead;
for (int i = 0; i < k; i++){
if(bHead == null){
return null;
}
bHead = bHead.next;
}
while (bHead != null){
pHead = pHead.next;
bHead = bHead.next;
}
return pHead;
}
完整代码如下
public class MainFindKthToTail {
public static void main(String[] args) {
ListNode listNode0 = new ListNode(1);
ListNode listNode1 = new ListNode(2);
ListNode listNode2 = new ListNode(3);
ListNode listNode3 = new ListNode(4);
ListNode listNode4 = new ListNode(5);
listNode0.next = listNode1;
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = listNode4;
ListNode listNode = firstFindKthToTail(listNode0, 1);
ListNode listNode5 = secondFindKthToTail(listNode, 1);
System.out.println(listNode);
}
/**
* 直接遍历全部链接节点,并得出链表的总长度,这样便可以将倒数第K个节点转换为正向第N个节点,但是这种解法并不优雅
* @param pHead
* @param k
* @return
*/
public static ListNode firstFindKthToTail (ListNode pHead, int k) {
// write code here
if(k < 0 || null == pHead ){
return null;
}
int i = 1;
ListNode indexListNode = pHead.next;
while (null != indexListNode){
indexListNode = indexListNode.next;
i ++;
}
if(k > i){
return null;
}
int index = i - k;
i = 0;
while (pHead != null){
if(i == index){
return pHead;
}
i++;
pHead = pHead.next;
}
return null;
}
/**
* 定义两个指针,前指针和后指针相距k个节点,当后指针到达根节点的时候,此时前指针的位置就是k节点的位置。
* @param pHead
* @param k
* @return
*/
public static ListNode secondFindKthToTail (ListNode pHead, int k) {
if(k < 0 || null == pHead ){
return null;
}
ListNode bHead = pHead;
for (int i = 0; i < k; i++){
if(bHead == null){
return null;
}
bHead = bHead.next;
}
while (bHead != null){
pHead = pHead.next;
bHead = bHead.next;
}
return pHead;
}
}
public class ListNode<T> {
private T val;
ListNode next;
public ListNode(T val){
this.val = val;
this.next = next;
}
}