给出一个头节点和待删除的节点,在O(1)的时间内删除该节点。(删除节点为X,前一个节点为i,后一个节点为j)
并没有想到思路,按平时的思路遍历到i节点,然后使i节点的next指向j节点。这样的思路也是O(n)的。
// 新思路:把节点j的内容复制到x,x指向j的下一个节点。但是有个问题,当x是尾指针的情况。
// 疑问:c/c++代码deleteNode函数中形参是指向指针的指针ListNode** node,java中怎么办呐?
package cn.wsw.offer;
import java.util.Scanner;
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
// 此方法中返回值是ListNode而不是void的原因是:当节点只有一个,而且被删除,此时head节点应指向null。
public static ListNode deleteNode(ListNode head, ListNode toDelete) {
if (head == null || toDelete == null) {
return null;
}
if (toDelete.next != null) { // 删除的节点不是尾节点
toDelete.val = toDelete.next.val;
toDelete.next = toDelete.next.next;
} else if (head == toDelete) { //只有一个节点,要删除的节点既是头结点也是尾节点
head = null;
} else { // 有多个节点,删除尾节点
ListNode t = head;
while (t.next != toDelete) {
t = t.next;
}
t.next = null;
}
return head;
}
public static void main(String[] args) {
// 构造链表
int[] array = {1,2,3,4,5};
// int[] array = {1};
ListNode head = new ListNode(array[0]), t = head;
for (int i = 1; i < array.length; i++) {
t.next = new ListNode(array[i]);
t = t.next;
}
// 删除第k个节点 使toDelete指向要删除的节点
int k = new Scanner(System.in).nextInt();
ListNode toDelete = head;
while (k > 1) {
toDelete = toDelete.next;
k--;
}
head = deleteNode(head, toDelete);
// 遍历删除节点后的链表
while (head != null) {
System.out.println(head.val);
head = head.next;
}
}
}

京公网安备 11010502036488号