链表中的倒数第k个节点,回文链表

1. 链表中的倒数第k个节点

描述:

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

思路:

(1)先进行合法性判断,若k<0 || head == null ,此时不合法,直接return null;

(2)定义一组快慢指针先指向head,先让fast走k-1步,实现为循环让fast在fast.next不为空的情况下(为空就是最后一个了)向后走一位并让k--,直到k-1==0)),若fast.next==null时仍有k-1!=0则说明k过大非法

(3),使得slow在fast前k-1位(倒数第k个就是尾结点前k-1个)

(4)循环进行fast.next和slow.next后移,直到fast指向尾结点停止fast.next==null,slow恰好在尾结点前k-1个也就是倒数第k个

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(k <= 0 || head == null){
            return null;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(k - 1 != 0){
            if(fast.next != null){
                fast = fast.next;
                k--;
            }else{
                return null;
            }
        }
        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

2. 回文链表

描述:

请判断一个链表是否为回文链表。

思路:

(1)先定义快慢指针,找到中间节点slow,让slow的前驱prev向前遍历,slow向后遍历依次比较,相同返回true,不同false,直到prev==null
(2)slow便利的时候顺便翻转链表,利用slow,slowNext,prev这三个指针,当slow到中点的时候前半个链表刚好翻转完,prev指向反转链表的头部
(3)链表若是奇数个,比较时就不对称了,把slow=slow.next吃力就好了
(4)下来就是比较了,定义一个比较变量返回boolean,if(prev.val!=slow.val)返回false,没进if就是相等,slow=slow.next,定义mid指向中点,把前半部分翻转回来,让prev.next=mid,然后向前遍历直到prev==null,完事返回ture

class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        ListNode prev = null;

        while(fast != null && fast.next != null){
            fast = fast.next.next;

            ListNode slowNext = slow.next;
            slow.next = prev;
            prev = slow;
            slow = slowNext;
        }
        ListNode mid = slow;
        if(fast != null){
            slow = slow.next;
        }

        boolean ifequle = true;
        while(prev != null){
            if(prev.val != slow.val){
                ifequle = false;
            }
            slow = slow.next;
            ListNode prevNext = prev.next;
            prev.next = mid;
            mid = prev;
            prev = prevNext;
        }
        return ifequle;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DU777DU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值