当前位置 博文首页 > zhouyu的博客:LeetCode第328题

    zhouyu的博客:LeetCode第328题

    作者:[db:作者] 时间:2021-08-21 13:08

    328.奇偶链表

    题目:

    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
    
    请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
    
    示例 1:
    	输入: 1->2->3->4->5->NULL
    	输出: 1->3->5->2->4->NULL
    示例 2:
    	输入: 2->1->3->5->6->4->7->NULL 
    	输出: 2->3->6->7->1->5->4->NULL
    说明:
    	应当保持奇数节点和偶数节点的相对顺序。
    	链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
    

    思路:

    目标:将所有奇数位置的节点前移
    定义一个方法:完成节点的插入和对应前驱后继关系的改变,即完成节点的移动
    循环完成所有移动的原因:第一个指针指向需要插入的位置的前驱,第二个指针指向要
    移动的节点的前驱,完成节点移动后,则第一个指针指向节点的后继即为下一次要插入
    位置的前驱,第二个指针指向节点的后继即为下一次要移动节点的前驱,则按此方法直
    到第二个指针遍历整个链表,则完成了整个移动过程
    

    代码:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode oddEvenList(ListNode head) {
            // exchange(head,head.next);
            // exchange(head.next,head.next.next.next);
            // return head;
            if(head == null){
                return head;
            }
            ListNode L = head.next;
            ListNode P = head;
            while(L != null && L.next != null){  //判断当前位置是否为链表末尾
                exchange(P,L);
                P = P.next;
                L = L.next;
            }
            return head;
        }
    
    	//将l2后的节点插入到l1之后
        public void exchange(ListNode l1,ListNode l2){
            ListNode p1 = l1.next;
            l1.next = l2.next;
            l2.next = l2.next.next;
            l1.next.next = p1;
        }
    }
    
    cs
    下一篇:没有了