链表的反转(逆置)

剑指offer面试题24 p142

LeetCode第204题

本题有两种解法,迭代法和递归法:
迭代法比价好理解:代码如下:,要注意的是必须用一个tempHead来记录当前操作的下一个结点
 

  //使用迭代的方法反转链表
    public static ListNode reverseList(ListNode head) {
       ListNode pre=null;
       ListNode cur=head,tempHead;
       while (cur!=null)
       {
           tempHead=cur.next;
           cur.next=pre;
           pre=cur;
           cur=tempHead;

       }
       return pre;
    }

递归法如下:这个方法比较抽象,读者可以自己画图模拟,或者使用debug进行调试
 


    //使用递归的方法反转链表
    public static ListNode reverseList1(ListNode head) {
       if (head==null||head.next==null)
           return head;
       ListNode p=reverseList(head.next);
       head.next.next=head;
       head.next=null;
       return p;
    }

完整的包含测试的代码贴在下面:

public class Num206 {

    public static void main(String[] args) {
        int[] a = {3, 2, 5, 8, 4, 7, 6, 9};
        ListNode listNode = new ListNode(a);
        listNode = reverseList(listNode);
        System.out.println(listNode.toString());
    }

    //使用迭代的方法反转链表
    public static ListNode reverseList(ListNode head) {
       ListNode pre=null;
       ListNode cur=head,tempHead;
       while (cur!=null)
       {
           tempHead=cur.next;
           cur.next=pre;
           pre=cur;
           cur=tempHead;

       }
       return pre;
    }

    //使用递归的方法反转链表
    public static ListNode reverseList1(ListNode head) {
       if (head==null||head.next==null)
           return head;
       ListNode p=reverseList(head.next);
       head.next.next=head;
       head.next=null;
       return p;
    }

    static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }

        ListNode(int[] arr) {
            if (arr == null || arr.length <= 0)
                throw new IllegalArgumentException("arr can not be empty");
            this.val = arr[0];
            ListNode cur = this;
            for (int i = 1; i < arr.length; i++) {
                cur.next = new ListNode(arr[i]);
                cur = cur.next;
            }
        }

        @Override
        public String toString() {
            StringBuilder s = new StringBuilder();
            ListNode p;
            for (p = this; p != null; p = p.next) {
                s.append(p.val + "->");
            }
            s.append("NULL");
            return s.toString();
        }
    }


}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值