写在前面:
此部分主要为了记录自己做题时的想法和探索的过程;
先自己想 再去翻书学习和巩固;
自知水平不行,只作为记录和笔记;
============================================================================
题目描述:输入一个链表,输出链表中倒数第K个结点
方法一:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public
class
Solution {
//蛮力法 遍历链表,记录每个结点后面结点的个数 k-1个则是对的
public
ListNode FindKthToTail(ListNode head,
int
k) {
if
(head==
null
) {
return
null
;
}
while
(head!=
null
) {
ListNode current=head;
int
i=
0
;
while
(current.next!=
null
) {
current=current.next;
i++;
}
if
(i==k-
1
) {
return
head;
}
head=head.next;
}
return
null
;
}
}
方法二:
public
class
Solution {
//方法二 两个指针法 遍历一遍链表
public
ListNode FindKthToTail(ListNode head,
int
k) {
if
(head==
null
) {
return
null
;
}
ListNode current=head;
int
n=
0
;
int
i=
1
;
while
(current!=
null
) {
current=current.next;
n++;
}
//判断是否超出链表节点个数
if
(k>n) {
return
null
;
}
current=head;
while
(i!=n-k+
1
) {
current=current.next;
i++;
}
return
current;
}
}
方法三
public
class
Solution {
//方法三 先遍历一遍链表得到链表长度n,再找出正数第n-k+1的结点
public
ListNode FindKthToTail(ListNode head,
int
k) {
if
(head==
null
) {
return
null
;
}
ListNode current=head;
int
n=
0
;
int
i=
1
;
while
(current!=
null
) {
current=current.next;
n++;
}
//判断是否超出链表节点个数
if
(k>n) {
return
null
;
}
current=head;
while
(i!=n-k+
1
) {
current=current.next;
i++;
}
return
current;
}
}
看书中还有借助散列表来实现的方法