首页 > 其他分享 >【链表2】链表中倒数第k个结点

【链表2】链表中倒数第k个结点

时间:2022-11-22 12:35:47浏览次数:43  
标签:结点 ListNode val int head next 链表 null 倒数第


题目描述


输入一个链表,输出该链表中倒数第k个结点。



有很多种方法,要么用集合,要么用双指针的方法。



方法一:集合(这里的每次移除的数要特别注意)



/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}*/
import java.util.ArrayList;

public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k<=0)
return null;
ArrayList<ListNode> list = new ArrayList<>();
while(head != null){
list.add(head);
head = head.next;
}
int size=list.size();
//判断,如果倒数第k个数大于链表长度
if(k > size)
return null;
int count =0 ;
//倒数第k个数,即从尾部移除k-1个数后的那个数即为第k个数
while(count != k-1){
//每次移除集合尾部最后一个数,注意是size-1
list.remove(--size);
count ++;
}

return list.remove(--size);

}
}


方法二:双指针法




/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
//1 判断 k<=0 或k>链表长度,都为错误输入
if(head == null || k<=0)
return null;
int len =0;
ListNode tempNode = head;
while(tempNode!=null){
len++;
tempNode = tempNode.next;
}
if(k>len)
return null;

//2 设置双指针
ListNode firstIndexNode = head;
ListNode secondIndexNode = null;
//让第一个指针先走k-1步
for(int i=0;i<k-1;i++){
if(firstIndexNode != null){
firstIndexNode = firstIndexNode.next;
}else{
return null;
}
}
secondIndexNode=head;

//第一个指针走到尾部,第二个指针刚好指向第k个结点
while(firstIndexNode.next!= null){
firstIndexNode = firstIndexNode.next;
secondIndexNode = secondIndexNode.next;
}

return secondIndexNode;
}
}



标签:结点,ListNode,val,int,head,next,链表,null,倒数第
From: https://blog.51cto.com/u_15886477/5877679

相关文章

  • 【链表3】反转链表
    题目描述输入一个链表,反转链表后,输出链表的所有元素。/*publicclassListNode{intval;ListNodenext=null;ListNode(intval){this.val=......
  • 【链表1】从尾到头打印链表
    题目描述输入一个链表,从尾到头打印链表每个节点的值。 输入描述:输入为链表的表头输出描述:输出为需要打印的“新链表”的表头这题有很多方法,可以先遍历链......
  • 【链表5】两个链表的第一个公共结点
    题目描述输入两个链表,找出它们的第一个公共结点。如:链表1:1>>>2>>>3>>6>>>7   链表2:4>>>5>>6>>>7最优解:交叉遍历两个链表,寻找公共节点:/*publicclassListNode{in......
  • 【链表6】链表中环的入口结点
    题目描述一个链表中包含环,请找出该链表的环的入口结点。/*publicclassListNode{intval;ListNodenext=null;ListNode(intval){this.val=......
  • 【链表7】删除链表中重复的结点
    题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5处理后为1->2->5/*publicclass......
  • golang算法-链表逆序
    前言链表逆序,表述的场景为:A->B->C->D逆序后:D->C>B>A分析需要插入数据,Insert方法需要打印数据,Print方法插入数据时,需要定位最后一个节点,LastNode方法最少需要两个偏移量......
  • golang算法-判断链表是否有环
    前言链表有环,体现为:A->B->C->D->B…分析需要将遍历过的节点存入map,以址为key,空struct为值遍历时,当前节点是否已存在,存在即有环。实现链表//链表的长度,不包过头typeNode......
  • C/C++员工通讯录(链表实现)
    C/C++员工通讯录(链表实现)一、设计一个员工通讯录(如编号、身份证号码、姓名等),用单链表实现员工通讯录的存储和增删改查等操作。通讯录链表的建立;通讯者信息的插入;通讯......
  • 4.队列、栈、链表
    目录一、队列1.什么是队列2.抽象数据类型Queue3.python实现ADTQueue4.举例热土豆问题(约瑟夫问题)5.举例:打印队列二、双端队列1.什么是双端队列?2.抽象数据类型Deque3.pytho......
  • 【算法】Java解答有序链表转换二叉搜索树,从中序与后序遍历序列构造二叉树
    有序链表转换二叉搜索树给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差......