第3关:双向循环链表的实现—链表的插入
200
- 任务要求
- 参考答案
- 评论42
任务描述
在单链表中,当我们要访问某一个结点的前驱结点时,要从头结点开始遍历;要删除链表中的一个结点时,仅给出该结点的指针还不行;在指定结点前插入一个新结点,同样需要从头开始遍历。对于这些问题,双向循环链表可以解决。
本关任务:实现双向循环链表的添加功能。
相关知识
双向循环链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
双向链表结点表示
双向链表中的结点由三个域组成,两个链接域一个数据域,如下图:
prev
链接域指向结点的直接前驱,next
链接域链接该结点的直接后继。
双向循环链表图示
下图是带头结点head
的双向循环链表示意图:
双向循环链表添加操作
双向循环链表的添加操作示意图如下:
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
- 补全
add(int item)
方法,实现双向循环链表的添加功能。
具体请参见后续测试样例。 本关涉及的代码文件MyDoubleLinkedList .java
的代码框架如下:(代码如下:看完个点赞撒,支持一下 鼓励哈嘛 )
package step3;
/**
* Created by sykus on 2018/1/15.
*/
public class MyDoubleLinkedList {
private Node head;//头结点
private Node tail;//指向链表的尾结点(YJH 42104521)
private int size;
public MyDoubleLinkedList() {
head = new Node(null, Integer.MIN_VALUE, null);
head.next = head.prev = head;
tail = head;
size = 0;
}
/**
* 添加元素到表尾
*
* @param item
*/
public void add(int item) {
/********** Begin *********/
Node newNode = new Node(null, item, null);
tail.next = newNode;
newNode.prev = tail;
newNode.next = head;
head.prev = newNode;
tail = newNode;
++size;
/********** End *********/
}
/**
* 打印双向链表
*
* @param flag true从左向右顺序打印, false从右向左顺序打印
*/
public void printList(boolean flag) {
Node f = head;
if (flag) {//向右
while (f.next != head) {
f = f.next;
System.out.print(f.item + " ");
}
} else {//向左
while (f.prev != head) {
f = f.prev;
System.out.print(f.item + " ");
}
}
}
public int size() {
return size;
}
//结点内部类
private static class Node {
int item;
Node next;//直接后继引用
Node prev;//直接前驱引用
Node(Node prev, int item, Node next) {
this.prev = prev;
this.item = item;
this.next = next;
}
}
}
感谢内生原动力 予星河