思路,倒数第N个元素,遍历链表,构造两个指针。
第一个从头先遍历N个节点,然后停下来。
第一个接着继续遍历,第二个从头开始遍历(同时遍历),直到第一个遍历到null为止。
这时第二个指针所在的位置就是倒数第N个元素的位置。
public class NumKNumber {
public static class ListNode{
ListNode next = null;
int data;
public ListNode(int data){
this.data = data;
}
}
public static void main(String[] args) {
NumKNumber numKNumber = new NumKNumber();
ListNode l1 = new ListNode(1);
ListNode l2 = new ListNode(2);
ListNode l3 = new ListNode(3);
ListNode l4 = new ListNode(4);
ListNode l5 = new ListNode(5);
ListNode l6 = new ListNode(6);
l1.next = l2;
l2.next = l3;
l3.next = l4;
l4.next = l5;
l5.next = l6;
int k = 10;
ListNode res = numKNumber.getNumKNumber(l1, k);
if(res != null){
System.out.println(res.data);
}else{
System.out.println("异常");
}
}
public ListNode getNumKNumber(ListNode head, int k){
if(k < 0 || head == null){
return null;
}
ListNode curr = head;
int len = 0;
// 判k是否大于链表长度
while(curr != null){
curr = curr.next;
len++;
}
if(len < k){
return null;
}
curr = head; //curr复位
//向后移动k个
while(k != 0){
curr = curr.next;
k--;
}
ListNode nodeK = head;
while(curr != null){
curr = curr.next;
nodeK = nodeK.next;
}
return nodeK;
}
}
下面这个没有判断k的取值,以及链表是否为空。
public class BackNNode {
public static class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public static void main(String[] args) {
ListNode l1 = new ListNode(1);
ListNode l2 = new ListNode(2);
ListNode l3 = new ListNode(3);
ListNode l4 = new ListNode(3);
ListNode l5 = new ListNode(4);
ListNode l6 = new ListNode(4);
l1.next = l2;
l2.next = l3;
l3.next = l4;
l4.next = l5;
l5.next = l6;
getbackNword(l1,2);
System.out.println("原始链表元素如下:");
while(l1!= null){
System.out.print(l1.val);
l1 = l1.next;
}
}
public static void getbackNword(ListNode head,int n){
ListNode p1=head;
ListNode p2=head;
for(int i=0;i<n-1;i++){
p2=p2.next;
}
while(p2.next!=null){
p1=p1.next;
p2=p2.next;
}
System.out.println("倒数第"+n+"个元素是"+p1.val);
}
}