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

这篇博客主要讲述反转链表相关思路。两种方法:时间复杂度均为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;
        }
    }
}
结果:
12345
5
4
3
2
1
1
2
3
4
5
输入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;
        }
    }

}
结果:
12345
1
2
3
4
5
5
4
3
2
1
输入12345,采用尾插法建立单链表,当前链表里数据为12345,反转后数据为54321

完整代码单击此处

你可能感兴趣的:(java不用api实现单链表反转(二))