Analysis:
{1, {2,3}, {4,{5,6},7}
/ | \
1 {2,3} {4,{5,6},
/ \ / \
2 3 4 {5,6}
/ \
5 6
Note, there are two types of nodes. One is actual number, the other is a list
As shown above, the problem can be solved by pre order traverse the tree. Simply, we can record the current index of a sub list to know which element should be visited.
class ListNode
{
public:
    std::vector<ListNode*> v;
    int val;
    //curIndex points the element to visit in v, if v is not empty
    //else curIndex == 0 means val is not visited yet.
    int curIndex;
    bool hasNext(){
        if(!v.empty())
        {
            if(curIndex >= v.size()) 
                return false;
            if(!v[curIndex]->hasNext() 
                && curIndex+1 >= v.size())
            {
                return false;
            }
            return true;
        }
        //if the element is visited, curIndex is 1.
        return curIndex == 0;
    }
    int getNext(){
        if(!v.empty())
        {
            if(!v[curIndex]->hasNext()) curIndex++;
            return v[curIndex]->getNext();
        }
        curIndex++;
        return val;
    }
    ListNode(int p){
        curIndex = 0;
        val = p;
    }
};
int main()
{
    ListNode l0(-11), l2(-11), l3(-11), l32(-11);
    ListNode n1(1),n2(2), n3(3),n4(4), n5(5),n6(6),n7(7);
    l32.v.push_back(&n5);
    l32.v.push_back(&n6);
    l3.v.push_back(&n4);
    l3.v.push_back(&l32);
    l3.v.push_back(&n7);
    l2.v.push_back(&n2);
    l2.v.push_back(&n3);
    l0.v.push_back(&n1);
    l0.v.push_back(&l2);
    l0.v.push_back(&l3);
    while(l0.hasNext())
    {
        std::cout << l0.getNext() << "\n";
    }
}
