链表题(2021-6-28)

1.从尾到头打印链表

import java.util.ArrayList;
public class Solution{
   public ArrayList<Integer> printListFormTailToHead(ListNode listNode){
  ArrayList<Integer> list=new ArrayList<Integer>();//创建一个list集合
   if(listNode!=null){//listNode链表节点不为空
   if(listNode.next!=null){//listNode下一个链表节点不为空
     list=printListFormTailToHead(listNode.next);//list集合就是下一个节点不为空的节点
    }
    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){//快指针的下一个节点为null,就返回
        return null;
     }
     fast=fast.next;
    }
    while(fast.next!=null){//当fast下一个节点不为空
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值