剑指Offer第十一天
双指针(简单)
题1:删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
class Solution {
public ListNode deleteNode(ListNode head, int val) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode cur = dummyHead;
while(cur.next != null){
if(cur.next.val == val){
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return dummyHead.next;
}
}
题2:链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
if(head == null){
return null;
}
//双指针
ListNode rightNode = new ListNode(-1);
ListNode leftNode = new ListNode(-1);
rightNode.next = head;
leftNode.next = head;
for(int i = k; i > 0; i--){
rightNode = rightNode.next;
}
while(rightNode.next!=null){
rightNode = rightNode.next;
leftNode = leftNode.next;
}
return leftNode.next;
}
}