单向链表
Posted on单向链表
单向链表**
博客分类:
【链表】 是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。 由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多, 但是查找一个节点或者访问特定编号的节点则需要O(n)的时间, 而顺序表相应的时间复杂度分别是O(㏒ n)和O(1)。 【单向链表】 是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始 一个节点包含两个域,一个信息域和一个指针域,指针域指向下一个节点,最后一个节点指向一个空值 单向链表有一个头节点,可以不存储任何信息,包含一个指向第一个节点的指针 特点: 1.访问节点速度慢,需要从头节点一次遍历链表 2.更新节点快,节点不需要移动,更改相应指针即可
单向链表节点类定义如下:
- public class Node
{ - AnyType element;
- Node
next; - }
要实现单向列表的相关操作,可定义类SingleLinkedList如下: Java代码
- public class SingleLinkedList
{ - private static class Node
{ - AnyType element;
- Node
next; - public Node(AnyType element){
- this.element = element;
- }
- }
- private Node
header = new Node (null); - private int size = 0;
- public boolean isEmpty(){
- return size==0;
- }
- public void makeEmpty(){
- header = null;
- }
- public int size(){
- return size;
- }
- ///
- /* Get element by index
- / //
- public AnyType get(int index){
- return getNode(index).element;
- }
- ///
- /* Add the element to the end of this list
- / //
- public void add(AnyType element){
- add(new Node
(element)); - }
- ///
- /* Inserts the specified element at the specified position in this list
- /* 插入逻辑:
- /* 1.创建一个新节点
- /* 2.将原index节点的前一个节点的指针指向新节点
- /* 3.将新节点的指针指向index节点
- /* 4.插入后,新节点的位置为index
- / //
- public void add(int index,AnyType element){
- Node
newNode = new Node (element); - Node
previous = getNode(index-1); - //index节点
- Node
node = previous.next; - //将原index节点的前一个节点的指针指向newNode
- previous.next = newNode;
- //将newNode的指针指向index节点
- newNode.next = node;
- size++;
- }
- ///
- /* Inserts the specified element at the specified position in this list
- /* 删除逻辑:
- /* 1.获得index节点的前一个节点previousNode
- /* 2.获得index节点的后一个节点nextNode
- /* 3.将previousNode的指针指向nextNode
- / //
- public void remove(int index){
- Node
previous = getNode(index-1); - Node
next = previous.next.next; - previous.next = next;
- size--;
- }
- ///
- /* 定义此方法是为了便于测试
- / //
- public List
getElements(){ - if(isEmpty()){
- return null;
- }else{
- List
elements = new ArrayList (); - Node
node = (Node ) header; - while(node.next!=null){
- node = node.next;
- elements.add(((Element)node.element).getValue());
- }
- return elements;
- }
- }
- //private methods
- private Node
getNode(int index){ - if(isEmpty()){
- throw new RuntimeException("List is empty");
- }
- int i = 0;
- Node
node = header; - while(i<=index){
- node = node.next;
- i++;
- }
- return node;
- }
- private void add(Node
newNode){ - Node
node = header; - while(node.next!=null){
- node = node.next;
- }
- node.next = newNode;
- size++;
- }
- }
- ///
- /* 链表反向
- / //
- public void reverse(){
- if(!isEmpty()){
- reverse(header.next,header.next.next);
- }
- }
- private void reverse(Node
node,Node nextNode){ - if(nextNode.next!=null){
- reverse(nextNode,nextNode.next);
- }else{
- //如果该节点是表尾,那么用头节点指向此节点
- header.next = nextNode;
- }
- //该节点的指针指向前一个节点P,并将节点P的指针设置为空
- nextNode.next = node;
- node.next = null;
- }
来源: [http://tangyanbo.iteye.com/blog/1472811](http://tangyanbo.iteye.com/blog/1472811)