forked from DreamCats/java-notes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathT22.java
More file actions
93 lines (84 loc) · 2.45 KB
/
Copy pathT22.java
File metadata and controls
93 lines (84 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package books;
import java.util.Stack;
/**
* @program JavaBooks
* @description: 链表中倒数第K个节点
* @author: mf
* @create: 2019/09/03 09:32
*/
/*
输入一个链表,输出该链表中倒数第K个节点。为了符合大多数
人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3
、4、5、6。这个链表的倒数第3个节点是值为4的节点。链表的定义如下:
*/
/*
思路
准备两个指针p1 p2
当p1++ 到k的时候,p2开始++
当当尾节点的时候,p2正好是倒数k个节点 n-k+1
追赶思路。。。
*/
public class T22 {
public static void main(String[] args) {
ListNode listNode1 = new ListNode(1);
ListNode listNode2 = new ListNode(2);
ListNode listNode3 = new ListNode(3);
ListNode listNode4 = new ListNode(4);
ListNode listNode5 = new ListNode(5);
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = listNode4;
listNode4.next = listNode5;
ListNode kNode = findKthToTail(listNode1, 6);
System.out.println(kNode.value);
}
/**
* 快慢指针问题
* @param headListNode
* @param k
* @return
*/
public static ListNode findKthToTail(ListNode headListNode, int k) {
if (headListNode == null || k == 0 ) return null;
//
ListNode pNode = headListNode;
ListNode kNode = headListNode;
int p1 = 0;
while (pNode != null) {
if (p1 > k - 1) { // 当p1走完k-1步,那么kNode开始走
kNode = kNode.next;
}
pNode = pNode.next;
p1++;
}
if (p1 >= k) {
return kNode;
}
return null;
}
/**
* 栈
* @param headListNode
* @param k
* @return
*/
public static ListNode findKthToTail2(ListNode headListNode, int k) {
if(headListNode == null || k <= 0) return null;
Stack<ListNode> stack = new Stack<>();
ListNode root = headListNode;
while(root != null) {
stack.push(root);
root = root.next;
}
int temp = 0;
while(!stack.isEmpty()) {
ListNode listNode = stack.pop();
temp++;
if (temp == k) {
return listNode;
}
}
return null;
}
}