单链表的反转是常见的面试题目。本文总结了2种方法。
单链表node的数据结构定义如下:
class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } }
把当前链表的下一个节点pCur插入到头结点dummy的下一个节点中,就地反转。
dummy->1->2->3->4->5的就地反转过程:
dummy->2->1->3->4->5 dummy->3->2->1->4->5 dummy->4>-3->2->1->5 dummy->5->4->3->2->1pCur是需要反转的节点。
伪代码
1 prev.next = pCur.next; 2 pCur.next = dummy.next; 3 dummy.next = pCur; 4 pCur = prev.next;
pCur is not null
// 1.就地反转法 public ListNode reverseList1(ListNode head) { if (head == null) return head; ListNode dummy = new ListNode(-1); dummy.next = head; ListNode prev = dummy.next; ListNode pCur = prev.next; while (pCur != null) { prev.next = pCur.next; pCur.next = dummy.next; dummy.next = pCur; pCur = prev.next; } return dummy.next; }
新建一个头结点,遍历原链表,把每个节点用头结点插入到新建链表中。最后,新建的链表就是反转后的链表。
新建一个头结点,遍历原链表,把每个节点用头结点插入到新建链表中。最后,新建的链表就是反转后的链表。
pCur是要插入到新链表的节点。
pNex是临时保存的pCur的next。
伪代码
1 pNex = pCur.next 2 pCur.next = dummy.next 3 dummy.next = pCur 4 pCur = pNex
pCur is not null
// 2.新建链表,头节点插入法 public ListNode reverseList2(ListNode head) { ListNode dummy = new ListNode(-1); ListNode pCur = head; while (pCur != null) { ListNode pNex = pCur.next; pCur.next = dummy.next; dummy.next = pCur; pCur = pNex; } return dummy.next; }