(1)输入一个链表,从尾到头打印链表每个节点的值。
思路:用一个数组来接收打印的链表,链表的结构已经给出。
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function printListFromTailToHead(head)
{
var arr=[];
while(head){
arr.unshift(head.val);
head=head.next;
}
return arr;
}
(2)
输入一个链表,输出该链表中倒数第k个结点。
function FindKthToTail(head, k)
{
var arr=[];
while(head)
{
arr.push(head);
head=head.next;
}
if(arr.length==0 || k>arr.length){return false;}
return arr[arr.length-k];
}
(3)输入一个链表,反转链表后,输出链表的所有元素。
思路:新建一个头结点,遍历原链表,把每个节点用头结点插入到新建链表中。最后,新建的链表就是反转后的链表。
function ReverseList(pHead)
{
var pre = null;
var next = null;
while(pHead){
next = pHead.next;
pHead.next = pre;
pre = pHead;
pHead = next;
}
return pre;
}
(4)输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
function Merge(pHead1, pHead2)
{
if (pHead1 == null || pHead2 == null) {
return pHead1 || pHead2;
}
var head = null;
if (pHead1.val < pHead2.val) {
head = pHead1;
head.next = Merge(pHead2,pHead1.next)
}
else {
head = pHead2;
head.next = Merge(pHead1, pHead2.next);
}
return head;
}
(5)输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
递归思想:把大问题转化若干子问题
此题转化为一个头结点和除去头结点剩余部分,剩余部分操作和原问题一致
function RandomListNode(x){
this.label = x;
this.next = null;
this.random = null;
}
function Clone(pHead)
{
if(!pHead){
return null;
}
var CloneHead=new RandomListNode(pHead.label);
CloneHead.label=pHead.label;
CloneHead.random=pHead.random;
CloneHead.next=Clone(pHead.next);
return CloneHead;
}