2.3 Implement an algorithm to delete a node in the middle of a single linked list, given only access to that node.
EXAMPLE
Input: the node ‘c’ from the linked list a->b->c->d->e
Result: nothing is returned, but the new linked list looks like a->b->d->e
1.方法一:brute-force 需要head指针
2.方法二:对LinkedList灵活应用不够
3.方法三:巧妙(还是没想到...)
class Node{
int data;
Node next;
public Node(int data, Node next){
this.data = data;
this.next = next;
}
}
public class Solution{
//middle is not my problem
//from head to mid
public static boolean removeMiddle1(Node head, Node mid){
if(mid == null)
return false;
if(head == null || head.data == mid.data){
return false;
}else {
Node p = head;
for(;p.next.data != mid.data && p.next != null;p = p.next)
;
//
if(p.next != null)
p.next = p.next.next;
return true;
}
}
//from mid to tail and delete tail
public static boolean removeMiddle2(Node head, Node mid){
//only 0 nodes after mid
//this case the alogrithm can't work, but this case
//is satisfied with the intention of this problem
//(ie. node in middle, not in border)
if(mid == null || mid.next == null)
return false;
Node p = mid;
for(;p.next.next != null;p = p.next)
p.data = p.next.data;
//remove the last node
p.data = p.next.data;
p.next = null;
return true;
}
public static boolean removeMiddle3(Node head, Node mid){
if(mid == null || mid.next == null)
return false;
mid.data = mid.next.data;
mid.next = mid.next.next;
return true;
}
private static void printNode(Node head){
Node p = head;
for(;p != null;p = p.next)
System.out.print(p.data+" ");
System.out.println();
}
public static void main(String[] args){
Node head = new Node(1, null);
head.next = new Node(2, null);
head.next.next = new Node(3, null);
head.next.next.next = new Node(4, null);
head.next.next.next.next = new Node(5, null);
head.next.next.next.next.next = new Node(6, null);
head.next.next.next.next.next.next = new Node(7, null);
Solution.printNode(head);
Solution.removeMiddle3(head, head.next.next.next);
Solution.printNode(head);
//can't work node mid not in the head
Solution.removeMiddle3(head, new Node(2, null));
Solution.printNode(head);
}
}