@@ -422,38 +422,38 @@ void myLinkedListFree(MyLinkedList* obj) {
422422
423423```Java
424424//单链表
425- class ListNode {
426- int val;
427- ListNode next;
428- ListNode(){}
429- ListNode(int val) {
430- this.val=val;
431- }
432- }
433425class MyLinkedList {
426+
427+ class ListNode {
428+ int val;
429+ ListNode next;
430+ ListNode(int val) {
431+ this.val=val;
432+ }
433+ }
434434 //size存储链表元素的个数
435- int size;
436- //虚拟头结点
437- ListNode head;
435+ private int size;
436+ //注意这里记录的是虚拟头结点
437+ private ListNode head;
438438
439439 //初始化链表
440440 public MyLinkedList() {
441- size = 0;
442- head = new ListNode(0);
441+ this. size = 0;
442+ this. head = new ListNode(0);
443443 }
444444
445- //获取第index个节点的数值,注意index是从0开始的,第0个节点就是头结点
445+ //获取第index个节点的数值,注意index是从0开始的,第0个节点就是虚拟头结点
446446 public int get(int index) {
447447 //如果index非法,返回-1
448448 if (index < 0 || index >= size) {
449449 return -1;
450450 }
451- ListNode currentNode = head;
452- //包含一个虚拟头节点 ,所以查找第 index+1 个节点
451+ ListNode cur = head;
452+ //第0个节点是虚拟头节点 ,所以查找第 index+1 个节点
453453 for (int i = 0; i <= index; i++) {
454- currentNode = currentNode .next;
454+ cur = cur .next;
455455 }
456- return currentNode .val;
456+ return cur .val;
457457 }
458458
459459 public void addAtHead(int val) {
@@ -473,7 +473,6 @@ class MyLinkedList {
473473 while (cur.next != null) {
474474 cur = cur.next;
475475 }
476-
477476 cur.next = newNode;
478477 size++;
479478
@@ -485,81 +484,79 @@ class MyLinkedList {
485484 // 如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点
486485 // 如果 index 大于链表的长度,则返回空
487486 public void addAtIndex(int index, int val) {
488- if (index > size) {
487+ if (index < 0 || index > size) {
489488 return;
490489 }
491- if (index < 0) {
492- index = 0;
493- }
494- size++;
490+
495491 //找到要插入节点的前驱
496- ListNode pred = head;
492+ ListNode pre = head;
497493 for (int i = 0; i < index; i++) {
498- pred = pred .next;
494+ pre = pre .next;
499495 }
500- ListNode toAdd = new ListNode(val);
501- toAdd.next = pred.next;
502- pred.next = toAdd;
496+ ListNode newNode = new ListNode(val);
497+ newNode.next = pre.next;
498+ pre.next = newNode;
499+ size++;
503500 }
504501
505- //删除第index个节点
506502 public void deleteAtIndex(int index) {
507503 if (index < 0 || index >= size) {
508504 return;
509505 }
510- size--;
511- //因为有虚拟头节点,所以不用对Index =0的情况进行特殊处理
512- ListNode pred = head;
506+
507+ //因为有虚拟头节点,所以不用对index =0的情况进行特殊处理
508+ ListNode pre = head;
513509 for (int i = 0; i < index ; i++) {
514- pred = pred .next;
510+ pre = pre .next;
515511 }
516- pred.next = pred.next.next;
512+ pre.next = pre.next.next;
513+ size--;
517514 }
518515}
516+ ```
519517
518+ ``` Java
520519// 双链表
521- class ListNode{
522- int val;
523- ListNode next,prev;
524- ListNode() {};
525- ListNode(int val){
526- this.val = val;
527- }
528- }
529-
530-
531520class MyLinkedList {
532521
522+ class ListNode {
523+ int val;
524+ ListNode next, prev;
525+ ListNode (int val ){
526+ this . val = val;
527+ }
528+ }
529+
533530 // 记录链表中元素的数量
534- int size;
531+ private int size;
535532 // 记录链表的虚拟头结点和尾结点
536- ListNode head,tail;
533+ private ListNode head, tail;
537534
538535 public MyLinkedList () {
539536 // 初始化操作
540537 this . size = 0 ;
541538 this . head = new ListNode (0 );
542539 this . tail = new ListNode (0 );
543540 // 这一步非常关键,否则在加入头结点的操作中会出现null.next的错误!!!
544- head.next= tail;
545- tail.prev= head;
541+ this . head. next = tail;
542+ this . tail. prev = head;
546543 }
547544
548545 public int get (int index ) {
549546 // 判断index是否有效
550- if(index>= size){
547+ if (index < 0 || index >= size){
551548 return - 1 ;
552549 }
553- ListNode cur = this. head;
550+ ListNode cur = head;
554551 // 判断是哪一边遍历时间更短
555552 if (index >= size / 2 ){
556553 // tail开始
557554 cur = tail;
558- for(int i= 0; i< size- index; i++){
555+ for (int i = 0 ; i < size - index; i++ ){
559556 cur = cur. prev;
560557 }
561558 }else {
562- for(int i= 0; i<= index; i++){
559+ for (int i = 0 ; i <= index; i++ ){
563560 cur = cur. next;
564561 }
565562 }
@@ -568,24 +565,23 @@ class MyLinkedList {
568565
569566 public void addAtHead (int val ) {
570567 // 等价于在第0个元素前添加
571- addAtIndex(0,val);
568+ addAtIndex(0 , val);
572569 }
573570
574571 public void addAtTail (int val ) {
575572 // 等价于在最后一个元素(null)前添加
576- addAtIndex(size,val);
573+ addAtIndex(size, val);
577574 }
578575
579576 public void addAtIndex (int index , int val ) {
580- //index大于链表长度
581- if(index> size){
577+ // 判断index是否有效
578+ if (index < 0 || index > size){
582579 return ;
583580 }
584581
585- size++;
586582 // 找到前驱
587- ListNode pre = this. head;
588- for(int i= 0; i< index; i++){
583+ ListNode pre = head;
584+ for (int i = 0 ; i < index; i++ ){
589585 pre = pre. next;
590586 }
591587 // 新建结点
@@ -594,22 +590,24 @@ class MyLinkedList {
594590 pre. next. prev = newNode;
595591 newNode. prev = pre;
596592 pre. next = newNode;
593+ size++ ;
597594
598595 }
599596
600597 public void deleteAtIndex (int index ) {
601- //判断索引是否有效
602- if(index>= size){
598+ // 判断index是否有效
599+ if (index < 0 || index >= size){
603600 return ;
604601 }
602+
605603 // 删除操作
606- size--;
607- ListNode pre = this.head;
608- for(int i=0; i<index; i++){
604+ ListNode pre = head;
605+ for (int i = 0 ; i < index; i++ ){
609606 pre = pre. next;
610607 }
611608 pre. next. next. prev = pre;
612609 pre. next = pre. next. next;
610+ size-- ;
613611 }
614612}
615613
0 commit comments