java不用api实现单链表反转(二)

来源:互联网 发布:孙中山民族主义 知乎 编辑:程序博客网 时间:2024/05/16 05:33

这篇博客主要讲述反转链表相关思路。两种方法:时间复杂度均为O(n),空间复杂度均为O(1)


方法一:头插法

头插法不仅可以创建单链表,还可以利用其思路反转链表。首先把头节点拆下,剩下的节点依次遍历,采用头插法,相当于从新建立链表。

package singleLinklistReverse;import singleLinklistReverse.Creat.Lnode;public  class Reverse {    Lnode p;    Lnode r;    public void reverseLinklist(Lnode first) {        // TODO Auto-generated method stub        p=first.next;        while(p!=null){            System.out.println(p.data);            p=p.next;        }        p=first.next;        first.next=null;        while(p!=null){            r=p.next;            p.next=first.next;            first.next=p;            p=r;        }        p=first.next;        while(p!=null){            System.out.println(p.data);            p=p.next;        }    }}结果:123455432112345输入12345,采用头插法建立单链表,54321是当前链表里的数据;12345是反转之后的数据。

方法二:正常思维

该方法就是遍历到某个节点时,将其指向先前的节点,不断遍历知道其为空。要注意的是除头节点外第一个节点指针为空(变为最后一个节点了嘛),要先处理它。然后遍历完毕后要将头节点指针指向最后一个节点。(需要三个指针)

/** *  *//** * @author Administrator * */package singleLinklistReverse_2;import singleLinklistReverse_2.Creat.Lnode;public class Reverse_2{    Lnode p,pre,r;    public void reverseLinklist(Lnode first) {        // TODO Auto-generated method stub         p=first.next;        while(p!=null){            System.out.println(p.data);            p=p.next;        }        p=first.next;//处理第一个节点        r=p.next;        p.next=null;        pre=first.next;        while(r!=null){            p=r;            r=r.next;            p.next=pre;            pre=p;        }        first.next=p;        p=first.next;        while(p!=null){        System.out.println(p.data);        p=p.next;        }    }}结果:123451234554321输入12345,采用尾插法建立单链表,当前链表里数据为12345,反转后数据为54321

完整代码单击此处

0 0
原创粉丝点击