QQ登录

只需要一步,快速开始

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

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

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

5273

主题

82

听众

17万

积分

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

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

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

    7 }- ?9 a9 e+ k4 N, S! F【Java演示】什么是链表?数据结构
    1 f$ {% x+ [. \/ o, D# ~2 _. g. f' O$ O一、单向链表) I) f" T8 K( k6 q2 q" ]7 h
    0 W$ q+ T, g6 n3 v
    1.png
    % i$ R0 f6 h% r8 r& z链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。
    + n! T" P" L. a" o0 U" \, d单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。( V( G# k7 w7 h: l7 S  @
    链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。
    $ ^" ]/ z' S4 T7 r- K' z! U- J& V/ Q3 @
    什么叫随机存储呢?
    % d3 S3 i+ J. j- M7 _% ^
    ! p  m3 I, s* A8 I6 j' |# M+ A如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。. ]3 c2 z0 `3 P4 U  o# m* l, k; {8 H
    上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。/ T  k4 ~1 f6 X
    3.png
      g" ~0 S4 r, i9 e- S1 a+ K+ ?, Q; t+ H+ }1 M8 i

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

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

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

    4.png
    & P* f8 c! _4 x0 g& i
    $ |* X$ E; N3 I) k) S- {, A0 t/ [/**" c+ [! m3 d" i5 _/ j; L
         * 链表查找元素: s4 q( w. q. ^8 M
         *1 k2 ~: V' Q( U4 `. v
         * @param index 查找的位置
    0 }* l* p3 ^1 P2 W     * @return index位置的Node对象% M6 s' k" e# e( H6 w
         */
    ( k$ W- ^6 C. b& Y' l( b9 }    public Node get(int index) {
    ( Z. {+ T3 O* A8 b3 J3 b        if (index < 0 || index > size) {2 ~# q. _) N! n' g
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    - [) \( h! g8 R0 D        }1 v6 Z" h' X$ q6 g
            Node temp = head;- ]9 B. E, |$ ^$ ^
            for (int i = 0; i < index; i++) {1 Y( R! l. m& n" J8 p
                temp = temp.next;. X+ x6 g6 {, O
            }; C' |( c# D$ |. V* b
            return temp;
    ( q' }4 ?$ ~( V- f    }
    7 t: [: a' p/ i* V; V, J( y# [3 U5 }- F$ p

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

    2. 更新节点 5.png
    3 ^) ?2 t3 D+ N! b0 Q  M
    2 z- a/ v: O* J. y& p如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。
    " \; i3 N% [$ c! m如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1)6 U3 @7 e) J0 h9 ?. K  E" M
    /**0 c( w+ p  F1 Z6 H5 a9 J% T
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    9 Y* o1 P" ^3 ~9 |) c     *0 n: E; K: }1 s, E9 i4 s
         * @param index 需要更新的节点的位置' V& |) \1 {4 [+ G! p7 D
         * @param data  新data# B1 D' ~; D3 ?1 K
         * @return 旧data
    8 c1 l& I) x) R3 X& j5 h; j     */
    7 l# d+ T) N1 o4 x    public int set(int index, int data) {% j3 B7 V( Y7 i% K1 c$ p3 q' T! s+ v
            Node x = get(index);5 V6 J1 o: c) \$ ~" p/ I
            int oldVal = x.data;) q" Q; p& [9 ~
            x.data = data;
    1 |4 p+ t8 H, p/ S: \( w3 O! n/ ?        return oldVal;/ I" m1 R. N" t5 i* T6 ?8 t
        }; M+ x3 f! @4 t. m
    - g: Z( j* \" @" @
    3. 插入节点

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

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

    • 尾部插入
    • 头部插入
    • 中间插入0 t% v5 l# @% ?1 n
    3.1. 尾部插入

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


    ; L! U# |5 r& O& M: z' _ 6.png 1 p* o2 P6 [  y3 m! S
    3.2. 头部插入

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

    • 第1步,把新节点的next指针指向原先的头节点。
    • 第2步,把新节点变为链表的头节点。
      ; x: a* l7 h  R% h1 p2 |6 T$ P- e
    7.png
    , P+ R' H! B( Y# d$ g+ l
    9 \8 k. P7 e; {+ G: Z6 M* g3 O3.3. 中间插入

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

    • 第1步,新节点的next指针,指向插入位置的节点。
    • 第2步,插入位置前置节点的next指针,指向新节点。& P& z+ M2 V/ R3 r
    8.png $ Z. h7 \* ~& l0 b$ G

    7 k0 H- b1 G' q4 a! Y3 z& F1 j三钟情况的代码合到一起8 ]4 ]; O9 o& s' h) b2 ~
    + ^! s7 v* T) }; n5 D
    /**
    & ], b, E' @' f4 J$ t     * 链表插入元素
    4 p$ g$ s* L5 h( ~     *# d( ^0 o0 I9 u8 k# k% H
         * @param index 插入位置
    " [1 a( d, z/ G* h- H     * @param data  插入元素 被插入的链表节点的数据/ p) V  H: W- D* m5 s
         */
    8 S, F! {+ ^+ D! ~( |, J9 x7 e3 r, m    public void insert(int index, int data) {1 [8 e3 T. \! t! Y3 x& V
            if (index < 0 || index > size) {, B% }& F8 L" i, v! C
                throw new IndexOutOfBoundsException("超出链表节点范围!");( A) H3 L  A( L4 W0 D" S
            }
    ! u& n1 @0 D0 i        Node insertedNode = new Node(data);
    # h3 j! _" T# G# n+ c+ J8 M        if (size == 0) {/ r: C. A  R; e* }* ]* `
                //空链表
    3 h6 ~" @9 G" U7 @            head = insertedNode;* }5 O" e4 ]! O1 k: i
                last = insertedNode;4 x* P1 b- ]/ g* ]
            } else if (index == 0) {2 Y7 I/ }) u' k: u
                //插入头部
    6 e8 T  }6 {; ?6 M9 I7 z, ~            insertedNode.next = head;/ Q( M8 \2 U/ O: B4 r+ R' n) Y
                head = insertedNode;4 j& R/ w$ a9 i  S( j8 m( r; z# s1 B
            } else if (size == index) {
    ! f) I" L% l$ d6 L4 n            //插入尾部
    & v' ^; X. c9 A2 l' z3 e            last.next = insertedNode;
    - Y: h" i- U. M$ q% o7 y* X            last = insertedNode;, E/ a; M8 s6 g
            } else {3 M. `) P+ C8 D) ^
                //插入中间0 D. r# W: t0 y( q# C. F% {
                Node prvNode = get(index - 1);% j& |8 I# ~7 ?
                insertedNode.next = prvNode.next;# y, Z) E% t( A; m
                prvNode.next = insertedNode;
    $ V% f  a2 a. J        }6 ]7 i2 E1 P% I- f6 K
            size++;
    2 v7 y; p2 u5 F3 U2 L    }
    8 T9 b8 H6 S, R  n
    ) o# D& H: l! r5 b' J) E/**
    7 K# h3 X6 u) I  I) _6 b% E2 ]     * 链表插入元素8 [1 Y" h) x' F' `* z
         *- K& y2 a7 O7 P4 Q# [4 T
         * @param index 插入位置
    6 ]. \+ k! K. I4 U) {1 `     * @param data  插入元素 被插入的链表节点的数据
    " J2 h5 n4 y4 |3 A4 U( L     */% M8 o8 r0 b# O% }5 Z
        public void insert(int index, int data) {- x. d- t1 B4 t
            if (index < 0 || index > size) {* C$ H- S/ X4 ^2 d5 q3 p1 d
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    0 t8 {+ _. \% l; E5 [: ]        }
    2 g; A1 G& d1 n7 b% F        Node insertedNode = new Node(data);# G+ }$ @, s3 Y  D6 t2 n" X" v6 A
            if (size == 0) {
    4 G( c2 X9 p5 a' y            //空链表! x; l0 v0 H+ |2 X7 w) y* y
                head = insertedNode;
    2 `. P% z' H: |! B: i5 W! K1 |* p            last = insertedNode;8 z8 U, r4 ?* M& k# V) y
            } else if (index == 0) {
    2 V3 n( Q! f8 O+ M            //插入头部
    $ u0 {; U8 h2 W3 {" d7 T            insertedNode.next = head;
    5 t7 Q# _5 o  F3 O* z0 e            head = insertedNode;
    * X- x- C; O: X4 c+ U' q  v        } else if (size == index) {6 d+ x5 L1 z+ s1 l( m5 D, M6 u
                //插入尾部6 W) K. x" @! x$ i; l; P! y) ^
                last.next = insertedNode;
    $ t6 D1 F9 x0 e, `5 ^            last = insertedNode;
    % T, q/ ?" t  F% s) k7 I! i5 K& J        } else {& B# O; G6 x6 Y/ J
                //插入中间7 ?, C, f8 o" x: `0 p
                Node prvNode = get(index - 1);8 \# Q7 z# E. ^/ U8 O$ g/ k
                insertedNode.next = prvNode.next;( T% R+ N. d3 \$ W7 H
                prvNode.next = insertedNode;
    * ?' i' j: h) W: ^! E$ n4 f        }
    ; B! j6 i# z/ F        size++;/ E- Y' T7 }& o" h9 R- `( P% |
        }9 g+ {# j" i6 f2 M+ T
    4. 删除元素

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

    • 尾部删除
    • 头部删除
    • 中间删除" i6 M; U) L5 v! a2 R. K
    4.1. 尾部删除

    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即
    ) T3 |% H* Y% h4 t6 r) `1 v2 o- M可。

    9.png
    $ K: |: v- ~3 K
    0 x' O( g3 `* L0 D  T6 Z1 t3 L! |4.1. 头部删除

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

    10.png 0 O) @- K; i" @0 Q& t
    8 C/ W& x$ O3 }1 _- B3 Y1 O
    4.1. 中间删除

    中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要- O! U5 g* h; d5 @- L- N8 p! b0 q
    删除元素的下一个节点即可。

    11.png * R2 T5 F2 @0 k9 I

    6 D1 P2 V& }; s) c2 f3 _, B+ m) r9 o( B* O1 |
    这里需要注意的是,许多高级语言,如Java,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。5 J% u6 k7 e1 G" M
    如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作,时间复杂度都是O(1)3 ]/ k/ d8 }$ Y& N
    /**9 q2 _, D6 g9 |# u: f% o8 [
         * 链表删除元素
    8 D( M: ~+ t/ I$ @     *8 n4 |' d$ h" i/ n3 }6 S& N& p) ^
         * @param index 删除的位置0 P9 ]7 o+ S4 x
         * @return 被删除的节点  x/ y6 ~8 Z6 \+ ~( _7 W
         */4 h4 u, w$ B& d6 f% V4 @3 ?
        public Node remove(int index) {  F" d( ?; c( y4 ]0 `
            if (index < 0 || index > size) {
    . [: w$ p" `) `$ e. V. w            throw new IndexOutOfBoundsException("超出链表节点范围");# v7 A& Z! ~  B  ^
            }4 H! @8 K5 K! k- `# y6 J
            Node removeNode;
    ' Q$ v: G2 i% V5 z        if (index == 0) {! B1 d- A; d0 e0 X( R: y
                if (size == 0) {
      b+ y2 V. O& l# h# q                throw new NullPointerException("当前链表为空,不可以进行删除操作");& u5 T4 _/ F* Z1 V4 y' J6 j
                }
    # h: a) @& \# t6 P# A            //删除头节点
    ) r. u, x6 H1 u% c            removeNode = head;
    * q* j& {' x  t7 [" M            head = head.next;
    9 R2 \0 A8 L: B        } else if (index == size - 1) {
    ( Z3 v* c0 m3 O. w& r' ~5 F6 w            //删除尾节点
    3 t' e  f6 U8 o7 i# }            Node preNode = get(index - 1);5 d- Z$ s- Y8 `' T
                removeNode = preNode.next;
    7 A) }) D$ T4 d. v% N$ f  O            preNode.next = null;2 S" Z  [0 \3 ~6 |" m
                last = preNode;
    9 p# ^# N+ \& k  x        } else {9 V% ~" v8 T* l* k$ D
                //删除中间节点6 R% h2 X% Y+ l3 w
                Node prevNode = get(index - 1);
    8 R* p0 u# I) ]! W' {, ^            removeNode = prevNode.next;% J! k* h+ Z0 {' `( u& {! v
                prevNode.next = prevNode.next.next;4 ]% x3 G8 E* j' U* w
            }+ v' n, O3 e' j2 ?5 c& L
            size--;! |2 E  N) ~* \, r2 z: P, T
            return removeNode;
    : v. ]  Q4 O; v( V    }
    ) s# Y" H) b8 NJava实现链表的完整代码package chapter2.part2;
    3 ^1 n4 V* R2 I: F  P
    1 l" p: n% I7 V* V: V0 r/**
    " C+ r/ [2 u/ |2 q# b' y5 M: x) M3 ` * Created by IntelliJ IDEA.5 S* p# J  s; a' P6 L& K
    *% ?* T! z# w" Z3 M, j6 Z
    * @Author: 张志浩  Zhang Zhihao
    6 L6 b% t' n% y2 a. H * @Email: 3382885270@qq.com
    . F, G7 G. b' |  Z$ ^9 B. D2 z: t * @Date: 2020/5/3
    - r0 @2 w* r1 c/ c( X  F- [ * @Time: 13:396 c# G8 t; d7 {) p% ^9 s- s* V: v7 Y
    * @Version: 1.0
    5 w9 S$ }" t5 m2 r9 d */
    . O- }* D+ T% jpublic class MyLinkedList2 {/ l0 U/ [/ ?& K3 S
        private Node head; //头节点6 ~( A; \" h0 H. ^
        private Node last; //尾节点; g& n* g, s" s' @# v6 s7 G7 T
        private int size; //链表实际长度
    8 X% E6 _) X2 b7 ^. r
    3 ^9 I. M, U8 J9 p% U8 l6 v' F$ L    public static void main(String[] args) {% {% i  r7 F9 ^$ {3 S& q
            MyLinkedList2 myLinkedList = new MyLinkedList2();, f5 p* l, O" m
    //        myLinkedList.remove(0); // java.lang.NullPointerException: 当前链表为空,不可以进行删除操作" D) D! g' @) d' I% t
    //        myLinkedList.remove(3); // java.lang.IndexOutOfBoundsException: 超出链表节点范围
    / |6 e3 t( m6 G. n- l  M* }2 W! ]        myLinkedList.insert(0, 3);. y' r! r5 b5 }/ A1 M
            myLinkedList.insert(1, 7);- \4 k3 E8 O8 [. M5 K5 T
            myLinkedList.insert(2, 9);% C- D# U& {. g3 |) I
            myLinkedList.insert(3, 5);) g5 R% Q6 K  W# n/ ?
            myLinkedList.insert(1, 6);7 W0 ?. q0 \6 d2 U' c& W9 H7 L
            myLinkedList.remove(0);+ E; J9 ~* X3 f0 ^! O6 b
            myLinkedList.set(0, 23);
      V& E; Q4 v3 h1 H" N2 O        myLinkedList.output();7 r+ y; U$ b; j% @( Q/ L
        }0 p" I' q: G9 _, j  U

    9 \2 J0 m* D3 T7 F: B" I    /**
    $ f2 c; D) n, Q     * 链表插入元素
    9 b5 F' U9 q( ~# i     *
    + |/ c& s7 s1 M1 C/ |     * @param index 插入位置, ]5 z, ]2 w- I, I/ k3 _/ F5 X
         * @param data  插入元素 被插入的链表节点的数据% J  w" z% j  m3 k+ ^6 t! R
         */
    7 L9 c& [( k" u8 R5 d3 {) R4 A    public void insert(int index, int data) {
    9 h$ Z& u) L0 L        if (index < 0 || index > size) {
    ) o. b) _4 @8 @3 @$ s- _            throw new IndexOutOfBoundsException("超出链表节点范围!");
    8 o2 A  \1 R$ w7 n! a        }
    " C3 c% E* _$ q: k1 h) k& N& E        Node insertedNode = new Node(data);( t9 a" L* [5 i
            if (size == 0) {% I4 ^$ w" m  f; z2 F# v
                //空链表  O$ A: h; C' H( F9 B, R6 H: b# V  B
                head = insertedNode;9 q8 t3 t$ i) @/ M5 r
                last = insertedNode;
    3 l% M" u& j. }$ \( u2 r& n; [* U        } else if (index == 0) {: {$ ^7 _6 k+ p; s- W6 P+ E
                //插入头部' Q) a$ X" s! e% i
                insertedNode.next = head;
    & C) }) a2 l1 C: Y            head = insertedNode;
    * }4 @( b* r% W* J! U, _        } else if (size == index) {
    # {9 `6 q% k) B' u! f, L            //插入尾部% J, k+ t. q% [- Y! R+ ^
                last.next = insertedNode;& Y8 d4 e" A3 }; T/ E. E+ E
                last = insertedNode;
    / K& r9 k% c7 _! k1 c        } else {
    # S5 R6 C2 f5 Y! Z            //插入中间& ?4 X# _8 C8 S% _7 V+ `- [3 K
                Node prvNode = get(index - 1);7 q. F% [$ d4 d; Y8 e, L
                insertedNode.next = prvNode.next;9 g% S$ S% W4 M
                prvNode.next = insertedNode;
      \' @0 K; R' a3 K! `9 F        }
    % ]% F1 q$ p, ~3 c' G2 B        size++;8 `+ H7 {( y* y0 @
        }
    # U: b2 Q' E# w6 K' i) G/ t/ c6 H
        /**
    : Y2 h# |) z; z+ |3 n     * 链表删除元素9 ?4 j* ?, e5 g4 z' n7 ^8 V; Y
         *; X' k/ ]2 L( Y, V7 [
         * @param index 删除的位置
    7 O4 D0 M5 R" g     * @return 被删除的节点& S1 F% o$ |& [, E& ?8 N4 |4 _
         */' k  {; l0 o; A5 O! }: F: B
        public Node remove(int index) {
    5 [+ Q6 Y+ V1 c- [+ H        if (index < 0 || index > size) {
    7 P3 C' U& {7 A# p            throw new IndexOutOfBoundsException("超出链表节点范围");
    * G# f; V; I& @# L" p  j1 O, q        }
    $ e# N+ A" b$ x; X        Node removeNode;
    " N& d9 I, B( S; }+ f3 T( j0 {        if (index == 0) {
    / m3 w% U! J' f$ o& y- v( I            if (size == 0) {+ {& B+ H5 l& E3 h8 ~9 B9 ]* ~
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");2 ]2 c; _8 T$ z  w
                }( d! f* i$ r  Z- G! g5 Y3 N  d2 a
                //删除头节点" A) Q! W: \5 ~; V# u' @/ [
                removeNode = head;9 m1 `: p5 j& L. m% j* P( A+ o* A4 I
                head = head.next;7 h8 I  g, \( j8 W0 B1 [
            } else if (index == size - 1) {; Y- o; @# B2 c- G* ]) g- d2 l; V
                //删除尾节点
    8 z) k8 ~" b( V' I" d4 o2 o7 h8 V            Node preNode = get(index - 1);
    2 y6 R2 S9 \' B$ m6 G            removeNode = preNode.next;3 f! \9 p9 Z0 q! ?0 o" B- `! G
                preNode.next = null;
    4 o! z4 q% B4 ]- ]. A            last = preNode;
    - I1 N- x) _1 \        } else {1 R, L7 y- \# G- x- p5 r$ ]* X# A0 c7 g
                //删除中间节点
    5 [, j- o# J1 Y" T8 T5 A; e0 w            Node prevNode = get(index - 1);
    , v7 X9 y, F& y- x& W            removeNode = prevNode.next;
    : T7 e0 q* ~# {  I( b            prevNode.next = prevNode.next.next;
    # ?( n+ {2 G, w% t5 h        }
    ( F: v  ]5 h2 {5 _3 h) z        size--;
    . _0 I' w/ ]4 l, d$ j# N; n3 ~        return removeNode;
    ; X$ n) |/ Y7 v+ y2 b7 y    }
    ! i0 g' ]1 G1 B* O* }$ i; M, f+ J6 n: B' l
        /**, l7 e+ f" w+ w1 C4 ^6 }
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。% A: \1 i$ o% m! _- f. X* ^0 O
         *
    ' t* P0 R) y7 P) y) e, ^" \% w. M     * @param index 需要更新的节点的位置
    + X+ R0 T# U3 m) ?2 n* {1 R' Y5 L     * @param data  新data# o! s5 C2 X4 W
         * @return 旧data
    7 ?% m$ H/ b" C8 ^, V     */
    ! Z; L! w( y& T* a    public int set(int index, int data) {
    6 I/ L& ]% o. m/ ^6 a* w        Node x = get(index);
    * w2 e2 ^3 }" R        int oldVal = x.data;
    2 e4 A* }1 _7 @7 R9 r        x.data = data;+ K$ Z, c' _" o1 i. m' g( B( u2 E
            return oldVal;
    6 R" z2 K  o. a7 b" d! x    }
    4 L, q0 X( r0 ^" y$ _  e5 G/ h" \8 [( b1 U! P7 m0 q8 l
        /**, Z* J7 J# e" m4 S; x1 K! ?
         * 链表查找元素; E5 X$ F' Q- ]/ ~" {- z
         *
    # }- y$ }# q  w1 V     * @param index 查找的位置
    + k, G* S9 X. f% }! k$ j) y     * @return index位置的Node对象9 R' @6 m4 r6 }/ _* D; a
         */
    3 x' C) P0 ~4 U, {4 ?- _    public Node get(int index) {
    . p: D' I. X1 U5 x- J        if (index < 0 || index > size) {
    0 Q/ v6 q7 C+ k# p8 M$ c3 h            throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    # f4 E4 y/ }% a0 A# `0 ^        }
    * V# _- F9 c% ]% S$ `2 J        Node temp = head;. H4 [; E( G8 X( k! |; t
            for (int i = 0; i < index; i++) {7 R! g/ u: z/ @5 q
                temp = temp.next;
    ' Q6 r# x9 I, r% [) J/ k        }8 f  s% C+ S0 o$ z
            return temp;2 D$ k$ t: N' r/ z+ t
        }5 l! R: x. o0 w
    ; X* _/ e8 p/ V
        /**8 e0 [0 d2 B' P' T
         * 输出链表
    6 `7 e0 j* A- P5 ^' D     */8 G& h6 E1 e& r8 {& i
        public void output() {
    * b6 r. C- u* T" M6 e4 E! H! X        Node temp = head;
    2 q; O5 Z8 a2 e) [8 o        while (temp != null) {3 r. C3 O) \1 B$ f3 E1 P. C$ ?
                System.out.print(temp.data + " ");: q! r- f+ y" c2 g  r
                temp = temp.next;5 @+ m2 C% [3 l; J0 _
            }
    . C8 G( t' R* q- ^  r, M4 D    }' h6 A5 u: V& X) {' w" R

    $ D4 y7 _/ q, z( m6 D    /**
    * D% Q! H0 c: q! D4 h, I     * 链表节点
    3 q/ a, a! Z2 b) E     */0 w! F! m) V8 ^* q
        class Node {
    4 J- w% u, ?% t. @8 g7 C1 E: b        int data;3 |+ k" P$ h: u; b
            Node next;
    $ t: O: U5 P! h# G4 U
    0 v+ [) B& L, _) a6 O2 g3 l9 ^3 _4 P0 M        Node(int data) {9 P' g0 t2 o: d+ Y" C/ a
                this.data = data;
    ' h/ x7 F+ Q" R8 a. N        }4 C0 O( |' S: C/ V, C) t- c$ G
        }
    1 x2 r# M* K' V3 ]}
    6 T5 \: }: W4 u% d& H' z! s; v) @' l! L
    : l. e8 g* ]9 x3 d' O1 R
    二、双向链表 12.png
      U- h; C% y" `% ?: y3 D双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev 指针。) |/ x3 t* M. w* B

    + h7 c9 F2 V8 ?( p+ Q0 g0 ?: ?7 ^. B. V0 C5 Q/ Y8 m1 }" f

    % G! c% p, e5 E0 v  U0 r% b8 S# E
    % _8 M, Q) ~. O$ s( o( D# O' U————————————————
    / M+ ^9 h& J: U- s3 [/ J版权声明:本文为CSDN博主「爱做梦的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  f9 r1 Y  |" ]' k6 o) B
    原文链接:https://blog.csdn.net/weixin_43124279/article/details/105904468* i" g% q  T1 L" P  }1 G

    : N+ X  e1 }5 I# f/ W
    8 L; w4 k9 Y7 U( n( B

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

    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, 2026-8-5 05:09 , Processed in 0.433953 second(s), 54 queries .

    回顶部