数据结构之单链表的反转

135 阅读1分钟

单链表的特征

image.png image.png

  1. 链表是以节点的方式存储的,是链式存储结构。
  2. 每个节点包含data域,next域指向下一个节点。
  3. 链表的各个节点不一定是连续存储。
  4. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。

单链表的反转

思路,定义两个变量temp(交换节点的变量),flag(指向temp的下一个节点,保存后面的节点).

  1. 让temp.next指向头2的链表的null(temp.next=头2.next temp这个节点就断了)
  2. 让头二的next指向temp这个节点(头2.next = temp,头2-->temp)
  3. 让temp节点也指向flag节点,flag节点后移1位(flag = temp.next)
  4. 让temp的下一个节点指向头儿的第一个节点(temp.next = 头2.next)
  5. 让头2的下一个节点指向temp节点(头2--->2--->1)
  6. 让temp节点也指向flag节点,flag节点后移1位(flag = temp.next)
  7. 让temp的下一个节点指向头儿的第一个节点(temp.next = 头2.next)
  8. 让头2的下一个节点指向temp节点(头2--->3--->2--->1)
  9. 头1的next节点指向头二的next节点(头1--->3--->2--->1)
public void reverse() {
        if (head.next == null || head.next.next == null) {   //判断节点是否为空或只有一个节点,一个节点没有反转的必要
            return ;
        }
        // 反转后链表头节点
        HeroNode revereHead = new HeroNode(0, "", "");
        // 遍历用辅助节点
        HeroNode temp = head.next;
        // 取出节点的下一个节点,保存遍历指针
        HeroNode flag = null;
        while (temp != null) {
            flag = temp.next;  //保存temp后面的节点 
            temp.next    =  revereHead.next ;     //让temp指向头儿的第一个节点
            revereHead.next = temp;     //让头2的第一个节点指向temp
            temp = flag;  // 辅助节点后移
        }
       head.next = revereHead.next;
    }

image.png

image.png

image.png