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;
}
}