指剑要约06。从尾到头打印链表的头节点,从尾到头返回每个节点的值(按数组返回)。
类别解决方案6 {
public int[]reverse print(ListNode head){ 0
//可以遍历一次,根据数组的下标将元素放入数组中。
int索引=0;
ListNode node=head//暂时计算链表的长度。
while(节点!=null){ 0
指数;
node=node.next
}
//需要打开一个数组。
int[]RES=new int[index];
for(int I=index-1;I=0;I-){ 0
RES[I]=head . val;
head=head.next
}
返回res
}
}
指剑献十八。删除链表的节点。
类别解决方案{
public listnode delete node(listnode head,int val){ 0
if(head==null)返回null
if(head . val==val)return head . next;//本来是returnhead,但是这种情况是有特点的。删除表头节点,可以删除这一行,因为后面用的是伪表头节点。
//删除该节点上一个节点的位置,先找到它,然后改变指针。
listnode dummy=newListNode(0);//虚拟头节点
dummy.next=head//让他指向头节点。
ListNodenode=dummy//临时节点,要删除的上一个节点。
while(节点!=nullnode.next!=null){ 0
if(node . next . val==val){ 0
node . next=node . next . next;//单链表删除就这么简单。
打破;
}
node=node.next//否则,继续向后移动。
}
returndummy.next
}
指剑Offer 22中倒数第二个k节点。链接列表。
输入一个链表,输出链表中最后一个k节点。为了符合大多数人的习惯,这个问题从1开始计数,也就是链表的尾节点是倒数第二个节点。
例如,一个链表有六个节点。从第一个节点开始,它们的值依次为1、2、3、4、5和6。该链表的倒数第二个节点是一个值为4的节点。
/**
*明确链接列表。
*publicclassListNode{
* intval
* ListNodenext
* ListNode(intx){ val=x;}
*}
*/
类别解决方案{
public listnode getkthfromend(listnode head,intk){ 0
//如果找到正数的第二个节点,你会怎么做?只需使用索引并往回走两次就可以到达那里。
//这里使用了双指针,两个指针之间的距离为k,同时向后移动;
ListNodefast=head,slow=head
趁着(快!=null k0){ 0
fast=fast.next
k-;
}
//这里使用了双指针,两个指针之间的距离为k,同时向后移动;
//慢指最后一个k
趁着(快!=null){ 0
fast=fast.next
慢=慢。下一步;
}
returnslow
}
}
来吧,大家