• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0

            Doubly-linked list

            In computer science, a doubly-linked list is a linked data structure that

            consists of a set of data records, each having two special link fields that

            contain references to the previous and to the next record in the sequence.

            It can be viewed as twosingly-linked lists formed from the same data items, 

            in two opposite orders. A doubly-linked list whose nodes contains three fields:

                  an integer value, the link to the next node, and the link to the previous node.

            The two links allow walking along the list in either direction with equal ease.
            Compared to a singly-linked list, modifying a doubly-linked list usually requires
            changing more pointers, but is sometimes simpler because there is no need to
            keep track of the address of the previous node.

            Contents

             [hide]

            Nomenclature and implementationThe

            references stored in the link fields are

            usually implemented by pointers; but

            (as in any linked data structure) they may also be address offsets or indices into

            an array where the nodes live.

            The link fields are often called forward and backwards, or next and previous.

            A pointer to any node of a doubly-linked list gives access to the whole list. However,

            it's usually convenient to handle the list by the pointers of the first and last nodes,

            e.g. when passing it to subroutines.

            Basic algorithms

            Open doubly-linked lists

            Data type declarations

             record Node {
            data // The data being stored in the node
            next // A reference to the next node; null for last node
            prev // A reference to the previous node; null for first node
            }
             record List {
            Node firstNode // points to first node of list; null for empty list
            Node lastNode // points to last node of list; null for empty list
            }

            Iterating over the nodes

            Iterating through a doubly linked list can be done in either direction. In fact, direction can

            change many times, if desired.

            Forwards

             node := list.firstNode
            while node ≠ null
            <do something with node.data>
            node := node.next

            Backwards

             node := list.lastNode
            while node ≠ null
            <do something with node.data>
            node := node.prev

            Inserting a node

            These symmetric functions add a node either after or before a given node, with the

            diagram demonstrating after:

            Doubly linked list insert after.png
             function insertAfter(List list, Node node, Node newNode)
            newNode.prev := node
            newNode.next := node.next
            if node.next == null
            list.lastNode := newNode
            else
            node.next.prev := newNode
            node.next := newNode
             function insertBefore(List list, Node node, Node newNode)
            newNode.prev := node.prev
            newNode.next := node
            if node.prev is null
            list.firstNode := newNode
            else
            node.prev.next := newNode
            node.prev := newNode

            We also need a function to insert a node at the beginning of a possibly-empty list:

             function insertBeginning(List list, Node newNode)
            if list.firstNode == null
            list.firstNode := newNode
            list.lastNode := newNode
            newNode.prev := null
            newNode.next := null
            else
            insertBefore(list, list.firstNode, newNode)

            A symmetric function inserts at the end:

             function insertEnd(List list, Node newNode)
            if list.lastNode == null
            insertBeginning(list, newNode)
            else
            insertAfter(list, list.lastNode, newNode)

            Deleting a node

            Removing a node is easier, only requiring care with the firstNode and lastNode:

             function remove(List list, Node node)
            if node.prev == null
            list.firstNode := node.next
            else
            node.prev.next := node.next
            if node.next == null
            list.lastNode := node.prev
            else
            node.next.prev := node.prev
            destroy node

            One subtle consequence of this procedure is that deleting the last element of a list

            sets both firstNode and lastNode to null, and so it handles removing the last node

            from a one-element list correctly. Notice that we also don't need separate "removeBefore"

            or "removeAfter" methods, because in a doubly-linked list we can just use "remove(node.prev)"

            or "remove(node.next)" where these are valid.

            Circular Doubly-linked lists

            Iterating over the elements

            Assuming that someNode is some node in a non-empty list, this code iterates through

            that list starting with someNode (any node will do):

            Forwards

             node := someNode
            do
            do something with node.value
            node := node.next
            while node ≠ someNode

            Backwards

             node := someNode
            do
            do something with node.value
            node := node.prev
            while node ≠ someNode

            Notice the postponing of the test to the end of the loop. This is important for the

            case where the list contains only the single node someNode.

            Inserting a node

            This simple function inserts a node into a doubly-linked circularly-linked list after

            a given element:

             function insertAfter(Node node, Node newNode)
            newNode.next := node.next
            newNode.prev := node
            node.next.prev := newNode
            node.next := newNode

            To do an "insertBefore", we can simply "insertAfter(node.prev, newNode)". Inserting

            an element in a possibly empty list requires a special function:

             function insertEnd(List list, Node node)
            if list.lastNode == null
            node.prev := node
            node.next := node
            else
            insertAfter(list.lastNode, node)
            list.lastNode := node

            To insert at the beginning we simply "insertAfter(list.lastNode, node)". Finally,

            removing a node must deal with the case where the list empties:

             function remove(List list, Node node)
            if node.next == node
            list.lastNode := null
            else
            node.next.prev := node.prev
            node.prev.next := node.next
            if node == list.lastNode
            list.lastNode := node.prev;
            destroy node


            References

            See also

            from wikipedia:
            http://en.wikipedia.org/wiki/Doubly-linked_list
            posted on 2011-01-02 12:04 chatler 閱讀(823) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm
            <2009年5月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久99热这里只有精品国产| 久久精品国产亚洲77777| 蜜桃麻豆www久久国产精品| 久久夜色精品国产亚洲av| 久久综合亚洲色HEZYO社区| 国产精品对白刺激久久久| 欧美久久精品一级c片片| 国产精品久久久久久久人人看| 久久这里只有精品18| 久久男人AV资源网站| 国内精品久久久久影院优| 久久久久香蕉视频| 精品午夜久久福利大片| 久久这里都是精品| 国产精品免费久久久久电影网| 久久人爽人人爽人人片AV| 麻豆国内精品久久久久久| 久久国产精品成人免费| 一本色道久久99一综合| 欧美午夜A∨大片久久 | 久久国产精品99精品国产| 色偷偷91久久综合噜噜噜噜| 久久久青草久久久青草| 麻豆AV一区二区三区久久| 午夜视频久久久久一区 | 国产精品99精品久久免费| 日本精品久久久久久久久免费| 国产精品久久影院| 精品久久久久久无码专区不卡| 日批日出水久久亚洲精品tv| 久久国产免费直播| 久久精品国产一区二区三区不卡| 精品午夜久久福利大片| 久久精品国产99国产精品澳门| 久久久久久亚洲AV无码专区 | 久久久综合九色合综国产| WWW婷婷AV久久久影片| 精品九九久久国内精品| 久久婷婷成人综合色综合| 久久亚洲日韩精品一区二区三区 | 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 |