链表中的倒数第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;
    }
}

上一篇:链表反转


下一篇:链表反转