单链表之:链表反转算法
上一篇博客讲述了一些链表的知识以及判断是否为回文串的算法,详见如何判断一个单链表是否为回文串?
一、递归方法
思路
从头节点开始,递归调用头节点的next,实际上就是从尾节点一次反转各个节点的指针指向。
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
static ListNode reverse0(ListNode head) { if (head ==null || head.next ==null) { return head; }
ListNode reHead = reverse0(head.next); head.next.next = head; head.next = null; return reHead; }
|
二、非递归方法
思路
从前到后,每两个节点依次进行反转。
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
static ListNode reverse1(ListNode head) { if (head == null || head.next == null) { return head; }
ListNode prev = head; ListNode cur = head.next; ListNode temp = null;
while (cur != null) { temp = cur.next; cur.next = prev;
prev = cur; cur = temp; }
head.next = null; return prev; }
|
ListNode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class ListNode { public char val; public ListNode next;
public ListNode(char val) { this.val = val; }
public ListNode next(ListNode next) { this.next = next; return next; }
@Override public String toString() { return "{" + "val=" + val + ", next=" + next + '}'; } }
|
测试方法
1 2 3 4 5 6
| public static void main(String[] args) { ListNode head = new ListNode('a'); head.next(new ListNode('b')).next(new ListNode('d'));
System.out.println(reverse1(head)); }
|
参考:https://blog.csdn.net/guyuealian/article/details/51119499#commentsedit
Last updated:
这里可以写作者留言,标签和 hexo 中所有变量及辅助函数等均可调用,示例:
http://yoursite.com/posts/55684/