JZ22 链表中倒数最后k个结点
描述
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
示例
输入:{1,2,3,4,5},2
返回值:{4,5}
说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较。
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @param k int整型
* @return ListNode类
*/
function FindKthToTail( pHead , k ) {
// write code here
let n = 0
let beginTemp = pHead
while(beginTemp){
n++
beginTemp = beginTemp.next
}
if(n<k){
return 0
}else{
for(let i = 0;i<n-k;i++){
pHead = pHead.next
}
return pHead
}
}
module.exports = {
FindKthToTail : FindKthToTail
};
JZ24 反转链表
描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
示例
输入:{1,2,3}
返回值:{3,2,1}
思路
由于是单向链表,所以没有节点的上一个;
反转链表首先是将当前指针cur的next指向的cur的前一个;
由于没有前一个指针,所以定义一个pre => cur.next = pre;
那么此时cur.next就变成的pre,而初始的cur.next没有保存,已经丢失;
所以在改变cur.next之前,要将cur.next存好 => curNext = cur.next;
此时cur的后一个和前一个节点都已经存好了;
那么就将pre = cur ; cur = curNext,将pre和cur两个指针向后移动。
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function ReverseList(pHead)
{
// write code here
let pre = null
let cur = pHead
let n=0
while(cur){
n++
let curNext = cur.next
cur.next = pre
pre = cur
cur = curNext
}
if(n<=0){
return null
}else{
return pre
}
}
module.exports = {
ReverseList : ReverseList
};