摘要:先跳过前个节点,然后初始化好这五个指针后,用中的方法反转链表。完成了第个节点的反转后,将子链反转前的头节点的设为子链反转过程中的下一个节点,将子链反转前头节点前面一个节点的设为子链反转过程中的当前节点。
Reverse Linked List I
递归法 复杂度Reverse a singly linked list.
click to show more hints.
Hint: A linked list can be reversed either iteratively or recursively. Could you implement both?
时间 O(N) 空间 O(N) 递归栈空间
思路基本递归
代码public class Solution { ListNode newHead; public ListNode reverseList(ListNode head) { reverse(head); return newHead; } private ListNode reverse(ListNode n){ if( n == null || n.next == null){ newHead = n; } else { ListNode prev = reverseList(n.next); prev.next = n; } return n; } }迭代法 复杂度
时间 O(N) 空间 O(1)
思路基本迭代
代码java
public class Solution { public ListNode reverseList(ListNode head) { if(head == null || head.next == null) return head; ListNode p1 = head; ListNode p2 = p1.next; while(p2 != null){ ListNode tmp = p2.next; p2.next = p1; p1 = p2; p2 = tmp; } head.next = null; return p1; } }
python
class Solution(object): def reverseList(self, head): """ :type head: ListNode :rtype: ListNode """ p1 = None p2 = head while(p2 is not None): tmp = p2.next p2.next = p1 p1 = p2 p2 = tmp return p1Reverse Linked List II
迭代法 复杂度Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
时间 O(N) 空间 O(1)
思路技巧在于记录下这么几个变量:dummyHead、子链反转前的头节点,子链反转前头节点前面一个节点,子链反转过程中的当前节点,子链反转过程中的下一个节点,这五个指针。先跳过前m个节点,然后初始化好这五个指针后,用I中的方法反转链表。完成了第n个节点的反转后,将子链反转前的头节点的next设为子链反转过程中的下一个节点,将子链反转前头节点前面一个节点的next设为子链反转过程中的当前节点。由于设置了dummyhead,我们所有的反转操作都是不包含头节点的,所以直接返回dummyhead的next就行了。
注意跳过前m个节点的for循环要从1开始,因为我们要保证head是第m-1个元素,如果m=1则不动。
代码public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if(head == null || head.next == null) return head; ListNode dummy = new ListNode(0); dummy.next = head; head = dummy; for(int i = 1 ; i < m; i++){ head = head.next; } ListNode headOfSubList = head.next; ListNode nodeBeforeHead = head; ListNode nextNode = head.next.next; ListNode currNode = head.next; for(int i = m; i < n ; i++){ ListNode tmp = nextNode.next; nextNode.next = currNode; currNode = nextNode; nextNode = tmp; } headOfSubList.next = nextNode; nodeBeforeHead.next = currNode; return dummy.next; } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64500.html
摘要:反转一个单链表。示例输入输出进阶你可以迭代或递归地反转链表。你能否用两种方法解决这道题解题思路每次遍历到最后一位取节点这种方法就算了时间复杂度太高。从链表末尾向头部逐个分离节点,并将节点添加到新链表的末尾。与迭代法原理相似。 反转一个单链表。 Reverse a singly linked list. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2...
摘要:反转一个单链表。示例输入输出进阶你可以迭代或递归地反转链表。你能否用两种方法解决这道题解题思路每次遍历到最后一位取节点这种方法就算了时间复杂度太高。从链表末尾向头部逐个分离节点,并将节点添加到新链表的末尾。与迭代法原理相似。 反转一个单链表。 Reverse a singly linked list. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2...
摘要:算法思路两种方法一般反转递归法一般解决定义三个指针,分别为,存储当前结点,指向反转好的结点的头结点,存储下一结点信息。递归法重点分析先确定终止条件当下一结点为时,返回当前节点判断当前的链表是否为递归找到尾结点,将其存储为头结点。 Time:2019/4/23Title: Reverse Linked ListDifficulty: EasyAuthor: 小鹿 题目:Reverse...
摘要:代码描述调转指针解法非递归用三个指针,紧紧相邻,不断前进,每次将指向,将指向指向。描述递归解法测试结果 Reverse a singly linked list. 代码ReverseLinkedList.java package list; public class ReverseLinkedList { /** * 描述 Reverse a singly...
摘要:三指针法复杂度时间空间思路基本的操作链表,见注释。注意使用头节点方便操作头节点。翻转后,开头节点就成了最后一个节点。 Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should ...
阅读 1410·2021-11-15 11:38
阅读 3540·2021-11-09 09:47
阅读 1951·2021-09-27 13:36
阅读 3191·2021-09-22 15:17
阅读 2526·2021-09-13 10:27
阅读 2847·2019-08-30 15:44
阅读 1141·2019-08-27 10:53
阅读 2686·2019-08-26 14:00