[剑指offer学习心得]之:反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

思路:

在单链表的表头临时接入一个节点,然后进行尾插法操作。反转单链表。

测试用例

最好就是提前想好测试用例,写出代码以后再用事先准备好的测试用例进行检查测试。

  1. 功能测试(输入的链表含有多个结点、只有一个结点)
  2. 特殊输入测试(链表头结点为null)

代码实现


public class ReverseList {

    public static void main(String[] args) {
        ListNode head = new ListNode();
        head.value = 1;
        head.next = new ListNode();
        head.next.value = 2;
        head.next.next = new ListNode();
        head.next.next.value = 3;
        head.next.next.next = new ListNode();
        head.next.next.next.value = 4;
        head.next.next.next.next = new ListNode();
        head.next.next.next.next.value = 5;
        head.next.next.next.next.next = new ListNode();
        head.next.next.next.next.next.value = 6;
        head.next.next.next.next.next.next = new ListNode();
        head.next.next.next.next.next.next.value = 7;
        head.next.next.next.next.next.next.next = new ListNode();
        head.next.next.next.next.next.next.next.value = 8;
        head.next.next.next.next.next.next.next.next = new ListNode();
        head.next.next.next.next.next.next.next.next.value = 9;
        printList(head);
        head = reverseList(head);
        printList(head);
        head = reverseList(head);
        printList(head);
    }

    private static class ListNode{
        int value;
        ListNode next;
    }

    /**
     * @param head 链表的头结点
     * @return 反转后的链表的头结点
     */
    private static ListNode reverseList(ListNode head){
        ListNode reverseHead=null;//记录反转链表后的头结点
        ListNode curNode=head;//记录当前处理结点
        ListNode preNode=null;//记录当前结点的前驱结点

        while(curNode!=null){
            ListNode next=curNode.next;//事先保存当前结点的下一个结点以防止链表断开
            if(next==null){
                reverseHead=curNode;//当然如果当前结点已经是最后一个结点了那么反转链表的头结点就是当前结点
            }
            curNode.next=preNode;//当前结点指向前一个结点

            preNode=curNode;
            curNode=next;
        }
        return reverseHead;
    }

    private static void printList(ListNode head){
        while(head!=null){
            System.out.print(head.value+"->");
            head=head.next;
        }
        System.out.println("null");
    }
}

结果:

1->2->3->4->5->6->7->8->9->null
9->8->7->6->5->4->3->2->1->null
1->2->3->4->5->6->7->8->9->null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值