编程之美--从无头链表中删除结点
2012-10-25 14:38
302 查看
package structure; import java.util.Iterator; /** * 该题目为:从无头链表中删除节点,而这个结点不是头也不是尾 * 我们只知道一个 p 指向链表中的一个结点,下面让我们把这个结点删除 * 想直接删除这个结点必需先知道 p 的前一个结点的引用,然后 前一个结点的 引用 .next = p.next * 这样就删除了,但引链表为单向链接,没有前一个结点的引用,那么怎么做呢? * 我们现在可以删除的数是 p 的后一个结点,就是 p.next = p.next.next 然后我们把 原来 p.next 的值 * 赋值给 p 中的值,这样就达到了删除了一个点的效果了 * * 下面是一个扩展,只遍历一遍来反转整个链表,就是从头开始遍历,将 原来的 next 指向它的前一个结点 * */ public class DeleteLinkNode { private Entry head = new Entry(' ', null); private Entry tail = head; public void add(char c) { Entry entry = new Entry(c, null); tail.next = entry; tail = entry; } public void remove(char c) { Entry p = head.next, pre = head; while (p != null) { if (c == p.value) { pre.next = p.next; break; } else { pre = p; p = p.next; } } } /** * 只遍历一次反转,就是将 next 指向它的前方就好了 */ public void reverse() { Entry p = head.next, next = p, pre = p; tail = p; while (p != null) { next = p.next; // null p.next = pre; pre = p; p = next; // p = null } head.next = pre; // head.next = p; tail.next = null; // p.next = null; } static class Entry { char value; Entry next; Entry(char value, Entry next) { this.value = value; this.next = next; } } public Iterator<Character> iterator() { return new Itr(); } class Itr implements Iterator<Character> { Entry h = head.next, pre = h; @Override public boolean hasNext() { return h != null; } @Override public Character next() { char c = h.value; pre = h; h = h.next; return c; } @Override public void remove() { } } public static void main(String args[]) { DeleteLinkNode list = new DeleteLinkNode(); list.add('A'); list.add('B'); list.add('C'); list.add('D'); list.reverse(); Iterator<Character> it = list.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } }
相关文章推荐
- 编程之美—从无头链表中删除结点
- 编程之美:从无头单链表中删除节点,讨论
- 3.4 从无头链表中删除给定的结点 & 遍历一次逆转链表
- 从无头单链表中删除某节点(编程之美3.4)
- 编程之美:从无头单链表中删除节点
- 《编程之美》3.4 从无头单链表中删除/添加节点
- 在一个无头指针的单链表中,删除指针p所指向的结点
- 《编程之美》3.4:没有头结点的单链表如何删除结点
- 单链表中头结点的有无. 并讨论下有无头结点在单链表的创建,打印,插入,逆置,删除中的区别.
- 单链表的建立(头部延长、尾部延长)、插入操作、删除操作(无头结点的删除、有头结点的删除)
- 编程之美——从无头单链表中删除节点
- 无头结点链表的创建及删除
- 每日一刷——删除无头链表非尾结点&倒序打印链表
- 面试题 单向链表(无头结点)一个指针指向其中的一个结点,如何删除这个结点?
- <笔试><面试>单链表相关(1)从尾到头打印链表、删除一个无头链表的非尾结点
- 假设在长度大于1的循环链表中,即无头结点也无头指针,s为指向链表中的某个结点的指针,试编写算法删除结点s的前驱结点
- 无头结点的单链表删除一个中间结点
- 链表面试题(一)---删除一个无头单链表的非尾结点
- 3.4——从无头单链表中删除结点
- 单链表---删除无头单链表的非尾结点(不遍历链表)