java linkedlist 算法笔记一

自我理解java linkedlist插入数据的算法:


首先看一下,linkedlist插入源代码:

public class LinkedList
    extends AbstractSequentialList
    implements List, Deque, Cloneable, java.io.Serializable
{
    private transient Entry header = new Entry(null, null, null);//初始化时先实例一个header,链表头


    /**
     * Constructs an empty list.//构造一个空链表
     */
    public LinkedList() {
        header.next = header.previous = header; //把链表头和尾先连到自己(1)
        addBefore(e, header);(2)

    }

.......

 public boolean add(E e) {//插入链表方法
            return true;
    }
.......

private static class Entry {//每个数据存放,所要用到的静态内部类
     E element;
     Entry next;//后一个节点
     Entry previous;//接一个节点

     Entry(E element, Entry next, Entry previous) {
         this.element = element;
         this.next = next;
         this.previous = previous;
     }
}


//插入操作方法
    private Entry addBefore(E e, Entry entry) {
         Entry newEntry = new Entry(e, entry, entry.previous);(3)
         newEntry.previous.next = newEntry;(4)
         newEntry.next.previous = newEntry;(5)
         size++;(6)
         modCount++;
         return newEntry;
    }


/*其他方法~~*/

 

以上部分就是算法所在:(一个简单的公式替换过程)

算法步骤(对应上面的编号):

(1)实例化一个header (Entry)

header.next = header

header.previous = header

当有第一条数据插入链表:

(3)实例化一个 Entry newEntry (以下简称E1)

E1.next = header

E1.previous = header.previous

E1.previous.next = header.previous.next = header.next

(4)由上面可得:

newEntry.previous.next = newEntry;

作用:

相当于 E1.previous.next = header.next = E1

其实就是,让上一个节的next指向下一个节点数据

所以header.next 的下一个节点就是E1

(5)E1.next.previous = header.previous = E1(这里用得巧妙)

其实这个用法单从E1.next.previous= E1单这么看,很直观因为E1的下一个节点数据的上一个节点就应该是E1

从上面可知,E1.next == header,为什么要把header.previous = E1呢?

其实包含着一个递归在里面。

如果再新增一个数据 Entry E2 :

从上面的代码可以看出,E2的实例化过程是:(其实linkedlist每次新增一个数据,都通过header传值)

Entry E2 = new Entry(data, header, header.previous);

主意代码部分的负值。关键就是这里,实例化的时候,E2.previous = header.previous = E1
简单得完成了负值过程。

然后 E2.previous.next = E1.next = E2
E2.next.previous = header.previous = E2 .......(接着插入下一条数据,如此递归)

(6)记录链表位数


设计到了一个小小的递归算法。

linkedlist记录一。完毕。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值