Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 656ea48

Browse files
Merge pull request youngyangyang04#2818 from donghuanjie/master
707代码规范化,添加部分comments; 203添加了java版本的递归
2 parents 8d4d810 + cc1cdb0 commit 656ea48

File tree

2 files changed

+94
-65
lines changed

2 files changed

+94
-65
lines changed

‎problems/0203.移除链表元素.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,37 @@ public ListNode removeElements(ListNode head, int val) {
337337

338338
```
339339

340+
递归
341+
342+
```java
343+
/**
344+
* 时间复杂度 O(n)
345+
* 空间复杂度 O(n)
346+
* @param head
347+
* @param val
348+
* @return
349+
*/
350+
class Solution {
351+
public ListNode removeElements(ListNode head, int val) {
352+
if (head == null) {
353+
return head;
354+
}
355+
356+
// 假设 removeElements() 返回后面完整的已经去掉val节点的子链表
357+
// 在当前递归层用当前节点接住后面的子链表
358+
// 随后判断当前层的node是否需要被删除,如果是,就返回
359+
// 也可以先判断是否需要删除当前node,但是这样条件语句会比较不好想
360+
head.next = removeElements(head.next, val);
361+
if (head.val == val) {
362+
return head.next;
363+
}
364+
return head;
365+
366+
// 实际上就是还原一个从尾部开始重新构建链表的过程
367+
}
368+
}
369+
```
370+
340371
### Python:
341372

342373
```python

‎problems/0707.设计链表.md

Lines changed: 63 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
}
433425
class 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-
531520
class 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+
privateint size;
535532
//记录链表的虚拟头结点和尾结点
536-
ListNode head,tail;
533+
privateListNode 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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /