剑指offer——链表中倒数第K个节点
1 题目描述
输入一个链表,输出该链表中倒数第k个结点。
2 思路一:利用栈
解题思路:利用栈的先进后出,倒序输出第k个节点,代码如下:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.Stack;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
Stack<ListNode> stack = new Stack<ListNode>();
ListNode kval=null;
int num=0;
while(head!=null){
stack.push(head);
head=head.next;
}
while(!stack.isEmpty()){
kval = stack.pop();
num++;
if(num==k){
return kval;
}
}
return null;
}
}
思路二:利用指针的运算
解题思路:先定义两个int型变量k1,k2
,遍历一遍链表,得到链表长度k1
,倒数第k
个节点即正数第k1-k+1
个节点,读取即可。
稍微不太正规的写法:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
int k1=0,k2=0;
ListNode oldhead = head;
if(head==null)
return head;
while(head!=null){
k1++;
head=head.next;
}
if(k1<k)
return null;
/*while(oldhead!=null){
k2++;
if(k2==k1-k+1)
return oldhead;
oldhead=oldhead.next;
}
return null;
*/
for(int i=0;i<k1-k;i++){
oldhead=oldhead.next;
}
return oldhead;
}
}
稍微正规些的写法:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
int k1=0,k2=0;//k1为链表长度,正规用count表示比较合适
if(head==null)
return head;
ListNode node=head;
while(node!=null){
k1++;
node=node.next;
}
if(k1<k)
return null;
/*while(oldhead!=null){
k2++;
if(k2==k1-k+1)
return oldhead;
oldhead=oldhead.next;
}
return null;
*/
ListNode p=head;
for(int i=0;i<k1-k;i++){
p=p.next;
}
return p;
}
}
注意正规写法:
- 链表中,通常不改变head的值,如果想对链表进行操作,可以新建一个新的指针,指向头结点,然后改变新的节点指针,这样保证每次对链表进行操作时,不用时刻记着是谁指向第一个结点;
- 计数时一般用count或num;
- 指向前一个节点的指针一般命名为pre,指向后一个节点的指针一般命名为next。