LinkNode copyLink(LinkNode link) {
		if (link == null)
			return null;

		// (1) copy the link list and hook up after the original node.
		LinkNode p = link;
		do {
			LinkNode p2 = new LinkNode();
			p2.value = new String(p.value.toLowerCase());
			p2.next = p.next;
			p.next = p2;
			p = p2.next; // NOTE: p = p.next.next;
		} while (p != null);

		// (2) copy the link list and hook up after the original node.
		p = link;
		do {
			if (p.extra != null) {
				p.next.extra = p.extra.next;
			}
			p = p.next.next; // NOTE: p = p.next.next;
		} while (p != null);

		// (3) split the two link lists apart.
		p = link;
		LinkNode link2 = p.next;
		while (p.next != null) {
			LinkNode q = p.next;
			p.next = q.next;
			p = q;
		}
		return link2;
	}