反转链表
link:206. 反转链表 - 力扣(LeetCode)
思路分析
与数组不同,链表没必要定义新的链表进行存储【对内存空间的浪费】
直接改变next指针即可.
注意头节点指向的下一个节点为null
双指针法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode cur = head; ListNode temp = null; while(cur != null) { temp = cur.next; cur.next = prev;
prev = cur; cur = temp; } return prev; } }
|
递归法
和双指针法是一样的逻辑【升华版】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public ListNode reverseList(ListNode head) { return reverse(null, head); } private ListNode reverse(ListNode prev, ListNode cur) { if(cur == null) { return prev; } ListNode temp = null; temp = cur.next; cur.next = prev; return reverse(cur,temp); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution{ ListNode reverseList(ListNode head) { if(head == null) return null; if(head.next == null) return head;
ListNode last = reverseList(head.next); head.next.next = head; head.next = null; return last; } }
|
两两交换链表中的节点
link:24. 两两交换链表中的节点 - 力扣(LeetCode)
思路分析
注意在交换之前要先存储需要的值
递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public ListNode swapPairs(ListNode head) { if(head == null || head.next == null) { return head; } ListNode next = head.next; ListNode newNode = swapPairs(next.next);
next.next = head; head.next = newNode;
return next; } }
|
虚拟头节点
我们想实现的是1和2交换,3和 4交换,此时很难不想到借用中间变量实现,不用递归实现【每次单独处理头节点】更优雅.
注意5后面是空指针就不用交换
判断next.next不为空是为了防止空指针异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public ListNode swapPairs(ListNode head) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode prev = dummy;
while (prev.next != null && prev.next.next != null) { ListNode temp = head.next.next; prev.next = head.next; head.next.next = head; head.next = temp; prev = head; head = head.next; } return dummy.next; } }
|