反转链表的三种不同实现

1、利用栈,将链表一个个拆开,放到一个栈中,然后再从栈中一个个拿出来,组成新的链表,实现链表的反转。

public ListNode ReverseList(ListNode head) {
    1、创建一个栈
        Stack<ListNode> stack= new Stack<>();
    2、当头节点不为空时,拆分链表,将节点一个个放到栈中。
        //把链表节点全部摘掉放到栈中
        while (head != null) {
            stack.push(head);
            head = head.next;
        }
    3、判断,如果栈为空,说明是空链表,直接返回null
        if (stack.isEmpty())
            return null;
    4、先取出来一个节点作为头节点
        ListNode node = stack.pop();
        ListNode dummy = node;
    5、栈中的结点全部出栈,然后重新连成一个新的链表
        while (!stack.isEmpty()) {
            ListNode tempNode = stack.pop();
            node.next = tempNode;
            node = node.next;
        }
    6、最后一个结点就是反转前的头结点,一定要让他的next
        //等于空,否则会构成环
        node.next = null;
        return dummy;
    }

2、遍历链表,一个一个拆开,然后将新拆开的放在新链表的表头,以此类推。

public ListNode ReverseList(ListNode head) {
    1、先创建一个新链表的表头指针,它永远指向表头。
        ListNode newHead = null;
    2、创建一个临时节点,用于存放剩下的链表的头节点。
        ListNode temp = null;
        while (head != null){
            3、先保存剩下的节点
            temp = head.next;
            4、将旧的头节点的下一个节点指向新的链表的表头,将它们串起来
            head.next = newHead;
            5、head节点赋给新链表的表头
            newHead = head;
            6、head重新指向旧链表的表头
            head = temp;
        }
        return newHead;
    }

3、采用递归实现,首先每次递归之前都要保存当前节点的下一个节点然后递归找到最后一个节点,并将其作为头节点返回之后就以此将倒数第二、第三、第四的节点拼接到后面

public ListNode ReverseList(ListNode head) {
        //首先写出递归终止条件
        if (head == null || head.next == null){
            return head;
        }
        //当不符合终止条件时,先保存当前节点的下一个节点,再递归查找下一个
        ListNode temp = head.next;
        //递归查询
        ListNode reverse = ReverseList(temp);
        //当找到最后一个并返回时,将上一个节点拼接到该节点后面
        temp.next = head;
        //并将尾节点的指向置空
        head.next = null;
        //返回新的头节点
        return reverse;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值