单向链表的反转和查找

求单链表中有效节点的个数

思路

  1. 情况一,空链表怎么样
  2. 情况二,非空链表,设置计数器,遍历数组
我的代码
 public int nodeNumber(){
        HeroNode temp = head;
        int number = 0;
        while (true){
            if(temp.next == null){
                break;
            }
            number ++;
            temp = temp.next;
        }
        return  number;
    }
教程代码:
public static int getLength(HeroNode head){
    //判断是否为空链表
    //定义一个辅助变量,计数器
    //遍历链表,如不为空计数器加一
    if(head.next == null){
        System.out.println("链表为空,节点数为零");
        return 0;
    }
    int counter = 0;
    HeroNode cur = head.next;
    while (cur != null){
        counter ++ ;
        cur = cur.next;
    }
    return counter;
}

总结:
1、 考虑的更加全面,我没有考虑到空链表的情况
2、逻辑更加清晰,遍历,当前节点为空跳出循环,不为空计数器加一。我的遍历只是为了找尾节点。

查找单向链表中倒数第K个节点

思路:

  1. 编写一个方法,接受头节点,同时接受一个index,index是倒数第index个节点
  2. 从头到尾遍历,得到总长度
  3. 从头开始遍历,遍历(size - index)个之后,即可得到
  4. 如果找到了,返回该节点,否则返回null
代码实现

我的代码:

public void search(int k){
    HeroNode temp = head.next;
    int Length = this.nodeNumber();
    int counter = 0;
    while (true){
        counter ++;
        if(counter == (Length - k + 1)){
            break;
        }
        if(temp.next == null){
            break;
        }
        temp = temp.next;
    }
    System.out.println(temp);
}

教程代码:
自己的代码:

public void search(int k){
    HeroNode temp = head.next;
    int Length = this.nodeNumber();
    int counter = 0;
    while (true){
        counter ++;
        if(counter == (Length - k + 1)){
            break;
        }
        if(temp.next == null){
            break;
        }
        temp = temp.next;
    }
    System.out.println(temp);
}

教程代码:

 public  static HeroNode findLastIndexNode(HeroNode head ,int index){
        //判断链表是否为空
        if(head.next == null){
            System.out.println("链表为空!");
        }
        //根据已有方法得到链表的长度
        int size = getLength(head);
        //校验所给index是否有效
        if(index < 0 || index > size){
            System.out.println("所输入的索引无效");
        }
        //然后遍历length - index次
        HeroNode temp = head.next;
        for(int i = 0 ;i < (size - index);i ++){
            temp = temp.next;
        }
        return temp;
    }

总结:
1、未考虑所给链表为空,未考虑所给索引是否为有效值的情况
2、思路更清晰,遍历的方式更加灵活
3、应当注意,是从头节点的下一个节点,第一个有效节点开始遍历的

单链表的反转

思路实现:

  1. 定义一个新的头节点 reverseHead
    2.从头到尾遍历原来的节点,每遍历一个节点将其取出,并且放在新的链表的reverseHead的最前端
  2. 原来链表的head.next = reverseHead.next

我的代码

第一次:

public void reverse(){
         HeroNode temp = head;
         HeroNode temp1 = temp.next;
         HeroNode temp2 = temp.next.next;
         temp1.next = temp;
         //temp.next = null;
         temp.next = temp;
         temp2.next = temp;
         temp1 = temp.next;
         temp1 = temp.next;
         temp.next = temp2;
         temp2 = temp1.next;
         temp1.next = temp;

画了小半张纸,以为只能在原来的链表上进行修改
第二次:

   public static void reverse(HeroNode head){
        //思路实现
        //定义一个新的头节点reverseHead
        HeroNode reverseHead = new HeroNode(0,"","");
        //从头到尾遍历原来的节点,没遍历一个节点将其取出,并且放在新的链表的reverseHead最前端
        HeroNode temp = head;
        HeroNode temp2;
        while (temp != null){
           
                temp = head.next;
                head.next = head.next.next;
                temp2 = reverseHead.next;
                reverseHead.next = temp;
                temp.next = temp2;                
          

        }
        //原来的链表head.next = reverseHead.next
        head.next = reverseHead.next;
    }

没加if之前是空指针异常,加了if之后是死循环
教程代码:

 public static void reverse(HeroNode head){
        //思路实现
        //定义一个新的头节点reverseHead
        HeroNode reverseHead = new HeroNode(0,"","");
        //从头到尾遍历原来的节点,没遍历一个节点将其取出,并且放在新的链表的reverseHead最前端
        HeroNode temp = head.next;
        HeroNode next = null;
        while (temp != null){
                next = temp.next;
                temp.next = reverseHead.next;
                reverseHead.next = temp;          
                temp = next;
        }        
        head.next = reverseHead.next;
    }

总结:

  1. 自己创建了一个节点来保存temp之后的节点,没有用头节点
  2. 直接把reversehead后面的节点赋给新转移的节点temp,没有像我一样在创建一个新的节点来保存。

问:为啥我就不对?

发布了19 篇原创文章 · 获赞 3 · 访问量 628

猜你喜欢

转载自blog.csdn.net/Blackoutdragon/article/details/103768741