【算法导论学习-21】单链表(single linked)的反转

《算法导论》241页课后题10.2-7

参考:http://www.nowamagic.net/librarys/veda/detail/2241

方案一:三个辅助空间

    不再赘述

方案二:头指针+两个辅助空间

思路:寻找一个辅助空间来存储当前节点,另一个节点存储当前节点的后继结点

初始化: current为头结点

循环过程:只要current.next不等于null

执行——pnext节点为:pnext=current.next

             current.next指向pnext节点的后继结点:current.next=pnext.next

             pnext.next指向头结点:pnext.next=L.head

              头指针指向pnext节点:L.head=pnext


1、第一次循环过程





2、第二次循环过程






3、第三次循环过程




4、第三次次循环结果


java实现并测试以上过程,这里单链表请参见本博客:【算法导论学习-20】单链表(single linked)的实现。
public class SinglyLinkedListTest {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        SinglyLinkedList<Integer> singlyLinkedList = new SinglyLinkedList<>();
        singlyLinkedList.printLink();
        System.out.println(singlyLinkedList.getLength());
        singlyLinkedList.add(1);
        singlyLinkedList.add(2);
        singlyLinkedList.add(3);
        singlyLinkedList.add(4);
        singlyLinkedList.add(5);
        singlyLinkedList.add(6);
        singlyLinkedList.printLink();
        reverseSinglyLinkedList(singlyLinkedList).printLink();
        singlyLinkedList.clear();
        System.out.println(singlyLinkedList.getLength());
 
    }
     /*反转单链表的函数*/
    public static SinglyLinkedList<Integer> reverseSinglyLinkedList(SinglyLinkedList<Integer> singlyLinkedList){
        if (singlyLinkedList.getLength()>0) {
            Node<Integer> current,pnext;
            /*初始化: current为头结点*/
            current=singlyLinkedList.getPreHead().next;
            /*循环过程:只要current.next不为null  */
            while (current.next!=null) {
                /*1、pnext节点为:pnext=current.next*/
                pnext=current.next;
                /*2、current指向pnext节点的后继结点*/
                current.next=pnext.next;
                /*3、pnext指向头结点:pnext.next=L.head*/
                pnext.next=singlyLinkedList.getPreHead().next;
                /*4、头指针指向pnext节点:L.head=pnext*/
                singlyLinkedList.setPreHeadNext(pnext);
            }  
        }
        return singlyLinkedList;
    }
}
控制台输出:

空链表
0
null→1→2→3→4→5→6→
null→6→5→4→3→2→1→
0





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值