LeetCode:Reorder List
题目(题目链接):
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
分析:先用快慢指针找到链表的中点,然后翻转链表后半部分,再和前半部分组合。需要注意的是把链表分成两半时,前半段的尾节点要置为NULL,翻转链表时也要把尾节点置为NULL。代码如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: void reorderList(ListNode *head) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(head == NULL || head->next == NULL)return; ListNode *fastp = head, *lowp = head, *tail = NULL; while(fastp != NULL && fastp->next != NULL) {//利用快慢指针找到链表的中点 tail = lowp; fastp = fastp->next->next; lowp = lowp->next; } tail->next = NULL; //此时tail 指向前半段的结尾 reverseList(lowp);//翻转链表后半段 fastp = head; tail = NULL; while(fastp != NULL) { ListNode *tmp = lowp->next; lowp->next = fastp->next; fastp->next = lowp; tail = lowp; fastp = lowp->next; lowp = tmp; } if(lowp != NULL) tail->next = lowp; } void reverseList(ListNode* &head) {//翻转链表 if(head == NULL || head->next == NULL)return; ListNode *pre = head, *p = pre->next; while(p != NULL) { ListNode *tmp = p->next; p->next = pre; pre = p; p = tmp; } head->next = NULL; head = pre; } };
网上一般都是C++实现,自己做了个java版本,算法不同,网上也有同样算法的C++版。
代码如下:
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ import java.util.*; public class Solution { public void reorderList(ListNode head) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(head==null||head.next==null||head.next.next==null) return; Vector<ListNode> vin=new Vector<ListNode>(); Vector<ListNode> vout=new Vector<ListNode>(); ListNode p=head; while(p!=null) { vin.add(p); p=p.next; } int i=0; int n=vin.size(); int k=n-1; for(;k>n/2;i++,k--) { vout.add(vin.get(i)); vout.add(vin.get(k)); } while(i<n/2+1) { vout.add(vin.get(i)); i++; } int j=0; for(;j<vout.size()-1;j++) { vout.get(j).next=vout.get(j+1); } vout.get(j).next=null; } }