1.从尾到头打印链表
import java.util.ArrayList;
public class Solution{
public ArrayList<Integer> printListFormTailToHead(ListNode listNode){
ArrayList<Integer> list=new ArrayList<Integer>();
if(listNode!=null){
if(listNode.next!=null){
list=printListFormTailToHead(listNode.next);
}
list.add(listNode.val);
}
return list;
}
}
思路:1.创建一个list集合
2.如果listNode链表的节点不为空
3.如果listNode.next下一个链表节点不为空,否则(下一个节点如果为空,说明是链表的尾部节点)就将当前链表的值添加进list集合中
4.list集合存储链表下一个节点不为空的节点
2.链表中倒数最后K个节点
import java.util.*
public class Solution{
public ListNode FindKthToTail(ListNode pHead,int k){
if(pHead==null||k<1){
return null;
}
ListNode fast=pHead;
ListNode slow=pHead;
while(k-->1){
if(fast.next==null){
return null;
}
fast=fast.next;
}
while(fast.next!=null){
fast=fast.next;
slow=slow.next;
}
return slow;
}
}
思路:链表中倒数第K个节点用双指针
1.如果链表为空,它的节点数小于1,则返回为空
2.定义双指针,一个慢指针和一个快指针
3.当k的个数远大于1,判断如果快指针的下一个节点为null,就返回;否则快指针就等于下一个节点。
4.当fast下一个节点不为空,快节点姐等于下一个
节点,慢节点就等于下一个节点;
5.返回慢节点
3.反转链表
public class Solution{
public ListNode ReverseList(ListNode head){
if(head==null||head.next==null){
return head;
}
ListNode pre=null;
ListNode next=null;
while(head!=null){
next=head.next;
head.next=pre;
pre=head;
head=next;
}
return pre;
}
}
思路:用递归 ListNode(链表的数据结构) 用双指针
1.以3个节点为例
2.用pre记录当前节点的前一个节点
3.用next记录当前节点的后一个节点
4.当前节点a不为空,进入循环,先记录a的下一个节点位置next=b;在让a的指针指向pre
5.当前pre和head的位置,正因为刚才记录了下一个节点的位置,所以该链表没有断,让head走向b的位置
6.当前节点为b不为空,先记录下一个节点的位置,让b指向pre的位置即a的位置,同时移动pre和head
7.当前节点c不为空,记录下一个节点的位置,让c指向b,同时移动pre和head,此时head为空,跳出,返回pre