Day11_剑指Offer
package com.sorrymaker.day3511;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 输入: head = [4,5,1,9], val = 5
* 输出: [4,1,9]
* 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
* @Author nextGame
* @Date 2021/8/22 22:41
* @Version 1.0
*/
public class DeleteNode {
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public ListNode deleteNode(ListNode head, int val) {
//头节点 == val ,那就直接返回head.next ,删掉头节点。
if (head.val == val) {
return head.next;
}
ListNode pre = head, cur = head.next;
//当 cur = head.next == null的时候,就是遍历完整个链表了,就可以跳出循环了
// 因为已经把头节点判定过了,现在是head.next.val == val的时候,就可以定位到要删除的节点了。
while (cur != null && cur.val != val) {
//让 pre = cur ,遍历完链表边,这里等于两个指针了,一前一后。
pre = cur;
cur = cur.next;
}
//当不是因为cur ==null 而结束循环的话,说明,存在需要删除的节点,
//这里就用pre .next = cur.next 。来删除这个val。
//原本pre.next 应该是cur 。 而cur现在是需要删除的节点,所以直接跳过cur,指向cur.next,间接删除。
if (cur != null) {
pre.next = cur.next;
}
return head;
}
}
package com.sorrymaker.day3511;
/**
* 输入一个链表,输出该链表中倒数第k个节点。
* 为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
*
* @Author nextGame
* @Date 2021/8/22 23:03
* @Version 1.0
*/
public class GetKthFromEnd {
public class ListNode {
int val;
GetKthFromEnd.ListNode next;
ListNode(int x) {
val = x;
}
}
public ListNode getKthFromEnd(ListNode head, int k) {
//双指针。
ListNode pre =head,cur = head;
//先走k步,
for (int i = 0; i < k; i++) {
// 考虑k 比链表大的情况下。
if(cur == null) {
return null;
}
cur = cur.next;
}
//当cur==null的时候,说明pre已经到了倒数第k个节点。因为 cur 比pre快k步,
while (cur!=null){
pre = pre.next;
cur =cur.next;
}
return pre;
}
}