QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3972|回复: 0
打印 上一主题 下一主题

【Java演示】什么是链表?数据结构

[复制链接]
字体大小: 正常 放大
杨利霞        

5250

主题

81

听众

16万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-4 15:55 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    6 \9 g3 W2 x- z* K  Z【Java演示】什么是链表?数据结构
    ; t2 N/ A& n$ ~一、单向链表
    6 D& z( j$ {1 i) W+ X. i, T" n
    2 C. K* E, k9 S4 z0 r6 s+ W/ k, D 1.png 7 F0 Y6 Y2 s9 J2 ^* i
    链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。
    % G! J% l1 r4 F5 y& V单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。! S: z7 p, \4 A' W- t, ^" L
    链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。# V7 k. H$ x5 o( ]" z0 k
    ( d, q& @: V  g; @% z
    什么叫随机存储呢?7 n) P2 u( I7 C( Q3 G2 I

    / j2 X: Z6 J2 \# ~- o& i如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。4 j4 ?1 s6 N* S' i
    上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。
    / A% k. |5 h: v. w6 K" _9 s( E! ] 3.png & z) j+ W! ~7 u; v
    + K7 c% {% j) s- x' f5 s+ h

    图中的箭头代表链表节点的next指针。

    链表的基本操作1. 查找节点

    在查找元素时,链表不像数组那样可以通过下标快速进行定位,只能从头节点开始向后一个一个节点逐一查找。

    4.png
    : U9 M( }1 b/ q& b' l- O$ z$ H* C) H. c
    ' {* o' d9 M* `0 {/**
    & b$ J6 i( ?/ P- r3 h6 e8 t     * 链表查找元素
    ; d+ n) b' c& V, }     *
    1 n) c. w! a$ t% h5 v     * @param index 查找的位置
    7 L, A) H7 Q/ ]# Q) ^# G     * @return index位置的Node对象
    1 m8 `, N# k! J2 ?" {, E$ X7 b8 x- K  L     */( I( P" K: d7 D3 V1 L# D
        public Node get(int index) {& c3 Q$ d1 h# c5 a0 n" _
            if (index < 0 || index > size) {
    4 n+ @  f* r" e) @( K4 z            throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    ; k+ o5 X" H; D; J" V& A        }
    - c0 v7 M0 w+ x* R9 y3 B" c        Node temp = head;- }4 A" a* G9 p7 [/ v7 C
            for (int i = 0; i < index; i++) {
    ' L7 v/ z9 \7 r6 N            temp = temp.next;
    % c& K$ f: a* R% P1 R        }: t( o& x* A0 o( v# a" C
            return temp;7 s/ |9 r) e1 u5 U+ q
        }
    * a( L6 e, D& J( w/ u& B
    3 w" [3 |* s1 l0 R

    链表中的数据只能按顺序进行访问,最坏的时间复杂度是O(n)

    2. 更新节点 5.png 1 s. F3 S6 T- U8 e) I) b/ P4 {

    ; {! k* Z0 R8 F5 O如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。) J  F0 O+ ^0 |  \# {
    如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1)
    ; @: u5 W3 b! b) ^9 C# G/**+ d8 h- L0 i6 l! e
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。2 K# g; }0 j! p7 ?! ]1 N
         *) f0 G3 s5 ^0 {, B, `6 k
         * @param index 需要更新的节点的位置% T& L0 p0 l; [6 S
         * @param data  新data
    6 w; Z) _& ]% h" `( q% P     * @return 旧data
    , Q9 i3 i9 E; E7 `     */: E$ J2 q7 o5 Q
        public int set(int index, int data) {
    4 r6 u7 C2 W0 }  |  \6 d        Node x = get(index);2 P: ~) Z3 Z! L  N' h
            int oldVal = x.data;
      G7 p* X$ T! b/ F! |3 [9 P6 r        x.data = data;2 h+ L- K0 P; |% K
            return oldVal;$ P! G* Z+ P0 ~. K4 }& V
        }
    4 S% f3 m% f/ p& v8 z  _  w/ T, V% `( d# A, r0 g
    3. 插入节点

    只要内存空间允许,能够插入链表的元素是无穷无尽的,不需要像数组那样考虑扩容的问题。

    与数组类似,链表插入节点时,同样分为3种情况。

    • 尾部插入
    • 头部插入
    • 中间插入
      ; [; o: ^* }2 Y) G; e) Y$ }% R
    3.1. 尾部插入

    尾部插入,是最简单的情况,把最后一个节点的next指针指向新插入的节点即可。

    $ p+ [4 W( F# [% X( B) U5 m
    6.png , H" R3 q; C4 G" d
    3.2. 头部插入

    头部插入,可以分成两个步骤。

    • 第1步,把新节点的next指针指向原先的头节点。
    • 第2步,把新节点变为链表的头节点。8 f* K, C7 }+ L8 `9 h! [
    7.png
    ) _0 I* v2 }" [7 F7 D  i
    0 e/ G8 }6 D& Y& q3.3. 中间插入

    中间插入,同样分为两个步骤。

    • 第1步,新节点的next指针,指向插入位置的节点。
    • 第2步,插入位置前置节点的next指针,指向新节点。
      $ p5 v9 v; t. g8 G  u7 p8 {
    8.png
    8 L( L% l+ Y9 R% x- e% j
    ; P1 g, [8 q. i- D& o4 P5 I* g三钟情况的代码合到一起
    . S4 _3 |1 z* J# D; Q: K4 S4 N% ~  v9 z5 C9 ^, \- t
    /**8 q# }; ^1 {; q9 V/ o- [4 d& N
         * 链表插入元素
    ; C' p- L& w) M" u' \; v/ g; a5 C     *2 ?$ P. M" `- p( K
         * @param index 插入位置! y3 l% S, }. l2 j( |" G% Q
         * @param data  插入元素 被插入的链表节点的数据
    ( ]! R$ I; n% O" {     */
    * a! z  z8 L4 u  j9 H# B/ @3 m$ W    public void insert(int index, int data) {
    0 r! w8 w" P2 e, N+ P4 ]0 a) v0 o' H        if (index < 0 || index > size) {
    . k" g3 ~) o4 _# S; Z! _9 `            throw new IndexOutOfBoundsException("超出链表节点范围!");
    + P) u  ^# g8 S$ e8 z, v        }
    7 e( K* E: @, I        Node insertedNode = new Node(data);- G' y! ~2 X8 V9 t
            if (size == 0) {: j6 h3 y8 [( J& Q8 l+ d! u
                //空链表5 C% O+ E# v0 R7 G6 A$ {+ T
                head = insertedNode;3 A& |+ P% h7 O. A  i4 v4 T. V
                last = insertedNode;
    9 _1 M4 ~" v. R$ K; x7 k        } else if (index == 0) {1 f# i8 v6 l9 C/ p7 ^; s8 }3 @
                //插入头部/ C" I( Z5 P& l# B/ |: E& B3 a6 L
                insertedNode.next = head;$ L1 N, _5 t; C7 l. _+ s2 g
                head = insertedNode;3 a, H8 c# M8 I  j/ [( I
            } else if (size == index) {
    1 U( S5 m  A% }            //插入尾部7 z; B* C/ j$ i4 r+ J
                last.next = insertedNode;  v' F# A2 M3 @% S
                last = insertedNode;
    - J2 W/ }, h; e; S; z' \        } else {% q1 A" V& C, @& E
                //插入中间
    8 s8 @! j+ F9 E& T- F6 I2 E            Node prvNode = get(index - 1);2 ^* f+ N$ ]8 C. ~" N
                insertedNode.next = prvNode.next;
    % K% ]: s5 F4 k) F: N* G            prvNode.next = insertedNode;
    2 V6 g& o) j$ }( m6 e6 c5 |        }
    # k: X4 Y- X+ Q1 g# S% m& X        size++;
    2 D/ p& M3 c, g4 k  R+ l    }; t& l& g8 z5 @# e0 F  q
    0 `( ?$ w1 q6 b; o8 G
    /**
    2 w# ?% g9 A5 I  a7 @1 ]     * 链表插入元素
    + S! b7 P' o- R" L* R     *! g% f" K/ d: n0 U4 K- h
         * @param index 插入位置
    % q9 v7 H& B7 C( }  A( z$ q. @$ q     * @param data  插入元素 被插入的链表节点的数据5 t# _( B/ S0 x% o  _% I
         */7 Q* {0 y4 J( }* I6 h$ P
        public void insert(int index, int data) {) z9 d5 h+ g# l' v9 I3 \# y
            if (index < 0 || index > size) {
    " W/ b5 b8 i4 c5 A, [) F: S            throw new IndexOutOfBoundsException("超出链表节点范围!");
    / P' X  N1 M. U( \% K        }  w/ Y# R+ w; a1 m4 z
            Node insertedNode = new Node(data);
    / {# T- Q3 o' @; c, v        if (size == 0) {
    , ^! y1 i1 w8 Z2 O9 c- M            //空链表
    1 Y5 c* D* P5 n: e. U9 x; c" s            head = insertedNode;& r/ X; |  w/ d; Y; C+ E( {
                last = insertedNode;
    1 z: q( V2 }/ ]2 h6 [! n6 m4 n        } else if (index == 0) {
    7 z+ s& H2 J  a6 C5 Y4 o) g9 a/ x3 `            //插入头部0 a5 n4 f, B9 S' M
                insertedNode.next = head;
    / z  K* d" h1 n1 R! k$ c1 O            head = insertedNode;. D, L, R, [! t: i! J( D
            } else if (size == index) {! m/ n( P, X$ M' W7 y; g
                //插入尾部: H6 S3 [) J5 U, q
                last.next = insertedNode;
    1 c4 M% o9 l7 P; M4 p# ?( w            last = insertedNode;, u* ]3 u* J% z  P8 j9 U) o
            } else {' J, {' m1 l$ h! U% X
                //插入中间% `- k0 u. h4 ?
                Node prvNode = get(index - 1);1 @1 `$ ~, z+ H, Z, j; P6 D
                insertedNode.next = prvNode.next;
    3 I8 P/ K3 e) @. b4 W: P5 l            prvNode.next = insertedNode;
    # J* h8 s" \" T6 _        }: c& R2 h4 N3 Q  ^/ P+ v
            size++;
    , g% a1 O( K3 k3 \: M2 ]: s    }1 h) ~  g9 `, |' g0 p+ {
    4. 删除元素

    链表的删除操作同样分为3种情况。

    • 尾部删除
    • 头部删除
    • 中间删除6 y6 l5 _2 Z+ n  i( h7 N! v! |
    4.1. 尾部删除

    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即( i- Y" Y0 L5 q" }0 B" _
    可。

    9.png - D' ]! m. {) p# c4 n  ?7 g. L

    % B9 L* W  G' r4.1. 头部删除

    头部删除,也很简单,把链表的头节点设为原先头节点的next指针即可。

    10.png
    3 ]8 F3 A. y! Z) L+ g) S" T6 E
    ; e( s, D6 Z7 e4.1. 中间删除

    中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要
    , x- [/ |( [2 q删除元素的下一个节点即可。

    11.png # N: s; Z& F0 B7 L

    , ~7 _. j1 ?# ^, o
    , i# j  j; K4 a" H4 I这里需要注意的是,许多高级语言,如Java,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。( o# A1 L1 L; v- g- z8 Z! t
    如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作,时间复杂度都是O(1), C5 Z  q2 U) u5 u& D
    /**: o- ]3 ]2 I# R
         * 链表删除元素
    3 g" u3 r% R+ |/ n( a     *% R7 T7 Z2 |: F
         * @param index 删除的位置* A! ]' _7 W! X' w
         * @return 被删除的节点% e3 `- j% a, E1 t5 m
         */
    # N* ]8 a6 m7 d! e! r/ }2 t    public Node remove(int index) {
    5 M' [, p7 P* n$ ]        if (index < 0 || index > size) {
    & n: W+ Y' Z8 M9 a( ^. X# Y/ T* M, u            throw new IndexOutOfBoundsException("超出链表节点范围");5 H7 e0 E) h- U
            }
    ) F  o# |* {; l1 ], ~* C        Node removeNode;
    - I. u! p& _% P' Y        if (index == 0) {
    2 j# H( _4 [/ F# F$ O            if (size == 0) {
    1 @6 U0 s- Q. Q9 @( N                throw new NullPointerException("当前链表为空,不可以进行删除操作");
    1 k' I& v# I6 j8 _8 @& A1 F' X7 Q  `            }
    / {1 f# n! }7 l7 R8 j* ^            //删除头节点
    5 q/ w& k" c# `; \( n) C1 Y4 b            removeNode = head;
    8 S" N% ~5 a: N8 x            head = head.next;" \" a) T: U  R" S3 \5 o: G
            } else if (index == size - 1) {& @1 a: v$ a6 b
                //删除尾节点2 H0 d& l/ H) v. }. V* s
                Node preNode = get(index - 1);9 E5 Z) C% Q+ x
                removeNode = preNode.next;
    7 C5 g8 J+ ^& Y4 [$ c* {            preNode.next = null;/ J7 r3 K; z/ o/ v) A8 ?0 z
                last = preNode;
    * H( o( k  [4 P2 c- L9 @        } else {/ w, |1 c) q$ N+ _
                //删除中间节点1 \+ b, _! M8 w  B+ r
                Node prevNode = get(index - 1);* x& i( }9 [; a( s
                removeNode = prevNode.next;
    ' {( {7 _9 `2 V: M            prevNode.next = prevNode.next.next;! c, t4 Q) Q7 w, @" P, c6 |3 c
            }$ c$ _7 w) g* t& A# F; H) p
            size--;
    8 Y1 k7 Q' M1 B3 _" D) `        return removeNode;
    & ~- G" G9 ?# f4 _1 j$ l- L    }
    ( B! f+ j( ?" g4 ?3 U: RJava实现链表的完整代码package chapter2.part2;
    5 O9 t2 r( a1 q. O1 y* S$ ?" O4 C3 L- D) W( [" e
    /**4 ?( w6 c& g, c1 Y& b4 N
    * Created by IntelliJ IDEA.
    3 M% D! e' g2 g" u" M) i *! i8 y4 Y7 Y/ ~& o# `2 G+ ]
    * @Author: 张志浩  Zhang Zhihao: H  B: M% [- J/ I/ r( i
    * @Email: 3382885270@qq.com& Q' \0 r+ y" @% d* _$ \
    * @Date: 2020/5/3
    1 A% w/ U8 S4 b * @Time: 13:39
    5 r2 j( Q4 R, d- P * @Version: 1.0
    . A  o9 s5 T$ h */
    1 H' H5 E! {' a9 P- X4 W, Q- Ypublic class MyLinkedList2 {
      K: ]/ B  d* U: u$ e    private Node head; //头节点5 F2 P; w# T  A- ]$ c9 d
        private Node last; //尾节点
    ' @1 [# k) T* Z! b& F; U. |    private int size; //链表实际长度- h1 Q, Y. ]- G
    $ p1 `0 K3 }0 M! S$ T
        public static void main(String[] args) {
    ( K; ?+ |) L& u! W3 c- k2 M        MyLinkedList2 myLinkedList = new MyLinkedList2();
    9 o9 F, p9 X$ d: u+ x- t//        myLinkedList.remove(0); // java.lang.NullPointerException: 当前链表为空,不可以进行删除操作
    2 ?- I; a" [3 M( _+ d. x) D: _//        myLinkedList.remove(3); // java.lang.IndexOutOfBoundsException: 超出链表节点范围% X6 h- S8 G; q: o# l
            myLinkedList.insert(0, 3);, b- a. a1 c: |2 N9 H' z1 i
            myLinkedList.insert(1, 7);
    % C0 D! y4 I5 ?# }        myLinkedList.insert(2, 9);
    - r" d* g- [5 g; q6 M& ?3 C        myLinkedList.insert(3, 5);
    4 o6 U! m* r" P" B2 Y7 K! M( P. O        myLinkedList.insert(1, 6);
    0 K1 _2 a2 M$ S1 \        myLinkedList.remove(0);! ]' K/ ?( P: }3 M: S3 E
            myLinkedList.set(0, 23);. {( X2 Q! Y- w2 B5 p
            myLinkedList.output();" {! ]' k/ B7 l- @3 T; l8 [
        }
    2 g1 N# J7 E( b3 j9 Q* @
    ( T0 Y) t6 z7 ~' y    /**) u  \9 \% z& `3 X
         * 链表插入元素
    $ M8 S3 X/ p9 e8 v% I  Z     *
    . g# @0 z2 J- Q+ `9 W     * @param index 插入位置
    . e1 a# B) X1 `& E     * @param data  插入元素 被插入的链表节点的数据! D7 i( F( o' L# |5 L
         */, W* h( J" a' L6 x% W! G
        public void insert(int index, int data) {
    0 P7 F8 u: n" T9 e        if (index < 0 || index > size) {0 m7 _  K3 u$ A1 z9 d7 ^3 A
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    4 [6 }2 w* [$ V6 }! J        }* b' F7 Q3 _- W+ g( `
            Node insertedNode = new Node(data);
    / v- b4 R) N2 q. }) h/ l* K0 w& M* t        if (size == 0) {. }5 o; R# {& i! H. d( ?
                //空链表4 n5 U9 K1 I, z' X. A
                head = insertedNode;
    9 [7 ?0 b) t; i' Y8 X            last = insertedNode;( f3 E7 G7 j! ^/ }/ S7 Q
            } else if (index == 0) {
    ) q- p+ V, m  ^) {            //插入头部; b  s$ w, q% q6 M# U
                insertedNode.next = head;6 P5 x- w  `& i3 u  f4 p
                head = insertedNode;1 e; g) r( H" D; ~
            } else if (size == index) {1 D. H8 T) v* x  L9 z. F
                //插入尾部
    ! {5 i6 t1 L0 G1 y            last.next = insertedNode;# Z" W. P2 q2 e2 {) X9 z% c+ ?5 X
                last = insertedNode;9 x' K; W. d, m( g, N/ Z
            } else {& }% m& B" ^( A4 K, m; \  J
                //插入中间/ O* E% H: x" y3 W+ L4 M
                Node prvNode = get(index - 1);; E! N9 U0 @2 j- k$ j7 F+ M
                insertedNode.next = prvNode.next;% h( |; d& i% H$ M
                prvNode.next = insertedNode;3 @7 T0 G' Q2 B% r: f
            }' z+ R9 ^5 O: `+ s+ z
            size++;+ Z' L! m! L' ~5 n5 n
        }, {8 A: x% g9 E5 A

    9 ?! O9 \% g5 u8 F6 o    /**& h8 g3 m7 S% a4 u, h. G" f. _
         * 链表删除元素  T! t" |7 K2 L, u
         *
    3 e& f7 J& p- a% L% Q) x     * @param index 删除的位置
    1 Y8 Y2 K. [- r3 n3 P( ~" ^' ?! Y     * @return 被删除的节点6 h- k% [5 x" H6 F! ?4 A$ B
         */
    5 V4 d5 T. ]- |, r2 r    public Node remove(int index) {
    2 {) ^* s" A/ [6 V  ~9 ]5 |7 c7 {        if (index < 0 || index > size) {
    5 E5 d$ d! T6 h3 _            throw new IndexOutOfBoundsException("超出链表节点范围");! k; }4 ]$ F  J
            }
      {1 c$ [$ a5 M3 Z        Node removeNode;
    * Z+ ~* F, z8 m: T$ X! V        if (index == 0) {
    % q) b( s1 d1 \6 ~. g6 Y            if (size == 0) {- D$ H, x+ Q8 J! N; F
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");/ n1 O3 X+ ?: {) S( R$ P
                }) W+ ^& L) D/ L6 N
                //删除头节点1 @" e; ~; `7 J8 x8 S
                removeNode = head;
    - n) l! P; l2 i1 h" M2 @" r            head = head.next;) R; D3 P% C$ \! R
            } else if (index == size - 1) {. @9 Y+ O% H. T0 V! R
                //删除尾节点& ~% R5 S0 y& N: u) S( X
                Node preNode = get(index - 1);
    6 i, M+ x/ f7 E/ M  ^            removeNode = preNode.next;. ^1 m) D  T/ `) S9 w# w: V. ]$ M
                preNode.next = null;" o3 u# N& Z7 H' W
                last = preNode;  o7 d2 N# q0 c# l* J! B
            } else {6 d2 p9 E' h* u3 p2 A
                //删除中间节点
    2 G* A% e5 i  @            Node prevNode = get(index - 1);( Y6 l- x; D$ g* X; g$ }
                removeNode = prevNode.next;
    4 e4 G% G! _$ R5 X" J6 O            prevNode.next = prevNode.next.next;9 ]7 _: j: k# {  p% D9 t( k
            }
    - `; {; k; ]# j        size--;+ }* X# o( L1 H7 @" V# ~
            return removeNode;
    8 n/ k8 a$ q2 l& V9 b3 |    }7 j+ L, w  P9 |9 W/ R/ B7 M

    - I/ N' p* }1 e+ z    /**. b  D& h1 y; ]) v$ S# s4 P  N
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    + f! z6 X+ b$ ^7 ^  q# l     *8 p( k) E5 m9 H* k
         * @param index 需要更新的节点的位置4 Q! t+ I1 h$ z7 k" ?. b, ~
         * @param data  新data
    $ ]$ ~$ E/ o  f9 F9 F# z, y     * @return 旧data
      U4 \5 t+ m" @- H7 I4 R$ F     */! b- M4 |' b6 y
        public int set(int index, int data) {
    0 n7 j: l3 m9 C        Node x = get(index);
    ! h" b9 }0 t$ }- u! d7 W- p3 J        int oldVal = x.data;9 q) w2 _% x$ h  H. O
            x.data = data;
    5 g0 D' [% ?. a1 K/ G        return oldVal;
    ; `+ V2 |$ }/ X; H- \& N! \& g+ n    }
    7 y3 J7 u5 B$ f* B& D
    ) w+ ^9 K5 ?- ~% e/ f0 _5 I    /**0 H1 K3 r  `$ C- X/ V( F8 _* L
         * 链表查找元素
    # e  u! K2 z. v( K% t     *
    # g5 ^/ M! h* w) {9 p8 ]7 ]     * @param index 查找的位置
    - L' |2 w" c9 M5 f8 @+ a/ e8 W     * @return index位置的Node对象
    + D, ]% W5 S8 l1 x     */- c, A# X" r; a" T7 E
        public Node get(int index) {
    4 I2 S; T" u  \        if (index < 0 || index > size) {  }: [0 Q7 r2 w  h1 c( t/ c
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    ) S) x0 Z, m6 r0 N( Q        }6 G% V+ l  x$ b3 t5 v/ ?
            Node temp = head;
    ) X$ W- |' T2 r* e. \0 b: W* L5 d        for (int i = 0; i < index; i++) {' Z7 `) {  C, n0 ^, v
                temp = temp.next;  U/ y8 I; ^: Z8 g: {1 u/ N
            }2 z7 Q* q$ E; x' g' @
            return temp;
    , z( t# W; O* N- x5 q3 H" L2 d    }0 S+ _- i$ q% s7 S2 O1 T: [

    4 }5 R2 M6 Z/ c3 C+ Q$ v    /**1 X( Y  N) J  }8 M
         * 输出链表
    8 P) ]/ x4 }0 H4 y+ d6 c* ]     */
    ; N2 W8 c" F: f' D    public void output() {
    " {; R! p" L8 S4 u7 a: P        Node temp = head;5 G9 N. u  e, o, R1 o( G
            while (temp != null) {
    - i1 a2 ]5 p1 H) X) p+ \            System.out.print(temp.data + " ");
    , c3 W+ e, \9 ?6 R# y2 l1 m            temp = temp.next;! w( F) n7 M8 z% _5 R
            }
    ) Q6 t: s" @! j. S/ Y3 G! ^    }
      u) g; b& F( R0 |4 o) X, T4 ]- T" D( [3 v/ }
        /**( l! t/ t. [- C/ t: G
         * 链表节点5 N7 e& ^& E# M
         */
    3 c) \# P+ k3 n" r4 L8 I* S/ A' O    class Node {  c2 p# v2 P9 J3 I
            int data;
    / f* q5 `" |) h; @' g5 ?0 b        Node next;
    9 s7 q. z. j: M
    6 P" O3 c6 v' H3 q% Q        Node(int data) {
    " Y" i. |) Q' r) @4 ]# ^            this.data = data;" N5 ~8 F' s4 Z# N
            }
    2 A& A' L  p, E    }
    5 P/ K' u$ X6 t7 C/ e/ t" E}! u) ]' ]1 B. \& g0 p' p9 w) f
    1 h( M4 W* H* ~& z; v6 V
    " g% G' E& U* M  _8 a
    二、双向链表 12.png 5 W4 _  u) @2 \; @6 w
    双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev 指针。/ X0 U- P5 ]* ^* B+ i

    - ^& l: i% Q* U4 f/ B, r& D
    * e6 U8 N" j' g9 W$ m
    9 T  {- H, {5 q0 ~
    % g; k3 h* ~: `( F% O8 p: C————————————————
    / l9 E1 U' x+ Y3 |+ }版权声明:本文为CSDN博主「爱做梦的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! o9 O/ D6 A# l
    原文链接:https://blog.csdn.net/weixin_43124279/article/details/105904468& b% q0 V' @3 m" K
    / c. @+ u% W7 w" n

    8 r" h+ U: U& @

    2.png (256.36 KB, 下载次数: 169)

    2.png

    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2024-4-26 12:29 , Processed in 0.384594 second(s), 53 queries .

    回顶部