//<1>建立链表
将栈里的值弹出来 建立链表:
ListNode
*
build
()
{
ListNode
*
head
=
(ListNode
*
)
new
ListNode
(
0
);
//带头结点的List
ListNode
*
front
=
head;
while
(v3.
empty
()
!=
true
)
{
ListNode
*
p
=
(ListNode
*
)
new
ListNode
( v3.
top
() );
v3.
pop
();
front->
next
=
p;
front
=
p;
}
front
=
NULL
;
return
(head->
next
);
}
//<2>倒置链表:设置 last=NULL 的尾部节点<reverse the linkedlist>
ListNode
*
reverseList
(ListNode
*
head)
{
if
(head
==
NULL
&&
head->
next
==
NULL
)
return
(head);
ListNode
*
last
=
NULL
;
//尾部节点 注意是NULL
ListNode
*
cur
=
head;
while
(cur
!=
NULL
)
{
ListNode
*
temp
=
cur->
next
;
//存储下一个节点
cur->
next
=
prev;
last
=
cur;
cur
=
temp;
}
}
//<3>将偶数index的节点放到后面
Time complexity :
O
(n)
Space complexity :
O
(
1
)
ListNode
*
oddEvenList
(ListNode
*
head) {
if
(head
==
null)
return
null;
ListNode odd
=
head, even
=
head->
next
, evenHead
=
even;
while
(even
!=
null
&&
even->
next
!=
null)
//注意这个条件判断的巧妙
{
odd->
next
=
even->
next
;
odd
=
odd->
next
;
even->
next
=
odd->
next
;
even
=
even->
next
;
}
odd->
next
=
evenHead;
return
head;
}
//<4>判断是否LinkedList有环 Tn=O(n)
//若是2个指针记录节点 这复杂度必然是n2
bool
hasCycle
(ListNode
*
head)
{
if
(head
==
NULL
||
head->
next
==
NULL
)
return
(
false
);
else
{
ListNode
*
p1
=
head;
ListNode
*
p2
=
head;
while
(p1
!=
NULL
&&
p2
!=
NULL
)
{
p1
=
p1->
next
;
if
(p2->
next
!=
NULL
)
//若遍历有NULL 立即推无环
p2
=
p2->
next
->
next
;
else
return
(
false
);
if
(p1
==
p2)
//相遇 最坏的情况整个是环 2圈相遇
{
return
(
true
);
}
}
return
(
false
);
}
}
//<5>删除指定数值的节点
ListNode
*
removeElements
(ListNode
*
head,
int
val)
{
if
(head)
{
if
(head->
val
==
val)
//头节点
{
while
(head
&&
head->
val
==
val)
{
head
=
head->
next
;
}
}
if
(head)
{
ListNode
*
front
=
head;
//此处保证第一个节点并不是想要的
ListNode
*
cur
=
head->
next
;
while
(cur)
{
if
(cur->
val
==
val)
{
front->
next
=
cur->
next
;
cur
=
front->
next
;
}
else
{
cur
=
cur->
next
;
front
=
front->
next
;
}
}
return
(head);
}
else
return
(
NULL
);
}
else
return
(
NULL
);
}
//<6>判断是否是交叉链表并返回交叉点
//train of thought:直接遍历判断最后的节点是否相同
//找入口节点:在长的|la-lb|处开始遍历直至二者相等!
class
Solution
{
public:
ListNode
*
getIntersectionNode
(ListNode
*
headA, ListNode
*
headB)
{
if
(headA
&&
headB)
{
vector
<
ListNode
*>
Node;
Node.
push_back
(headA);
Node.
push_back
(headB);
vector
<
int
>
L;
//记录长度
L.
push_back
(
1
);
L.
push_back
(
1
);
ListNode
*
pa
=
headA;
ListNode
*
pb
=
headB;
//判断最后的节点是否一致
while
(pa->
next
)
{
L[
0
]
++
;
pa
=
pa->
next
;
}
while
(pb->
next
)
{
L[
1
]
++
;
pb
=
pb->
next
;
}
if
(pa
==
pb)
//如果最后的是相同节点则就是有交集
{
if
(leangth_a
>=
length_b)
{
index_long
=
0
;
index_short
=
1
;
}
else
{
index_long
=
1
;
index_short
=
0
;
}
int
i
=
1
;
//q节点是长的头结点
ListNode
*
cur
=
Node[index_long];
while
(i
<=
math.
abs
(length_a
-
length_b))
{
cur
=
cur->
next
;
i
++
;
}
//cur移动到|la-lb|的位置 此时cur q距离intersection的位置一样
ListNode
*
q
=
Node[index_short];
while
(q
!=
cur)
{
q
=
q->
next
;
cur
=
cur->
next
;
}
return
(q);
}
else
return
(
NULL
);
}
else
return
(
NULL
);
}
};