Java算法——反转链表(LeetCode第206题)
问题描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例
分析
解法一:
使用头插法返回一个新的结果链表,因为头插法产生的链表就是逆序的。因此刚好就是反转过来的链表。
解法二:
使用双指针,直接将链表中的指针全部改变方向,最终产生的链表就是反转过来的链表。
如图:
定义一个preNode初始化为null,一个nextNode指向头节点。定义一个tempNode临时节点保存nextNode.next。
首先用tempNode保存当前节点的下一个节点,然后将当前节点指向preNode。
preNode与当前节点nextNode再后移。
重复上述过程直至nextNode为空,此时整个链表指针全部改变了方向。
返回preNode就是反转好的链表。
代码实现
解法一:
class Solution { public ListNode reverseList(ListNode head) { if (head == null) return null; ListNode result = new ListNode(); ListNode curHead = head; while (curHead != null) { ListNode temp = curHead; //取出一个节点 curHead = curHead.next; //移至下一个节点 temp.next = result.next; //头插法 result.next = temp; } return result.next; } }
解法二:
class Solution { public ListNode reverseList(ListNode head) { ListNode preNode = null, nextNode = head; ListNode tempNode; while (nextNode != null) { tempNode = nextNode.next; //保存下一个节点 nextNode.next = preNode; //将指针指向前面的节点 preNode = nextNode; //preNode后移 nextNode = tempNode; //nextNode后移 } return preNode; } }
下一篇:
Java算法怎么学?算法是什么?