反转链表, 大致有递归和非递归方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 class ListNode { constructor (value = null ) { this .value = value; this .next = null ; } print ( ) { let result = this .value ; let head = this ; while (head.next ) { result += '->' + head.next .value ; head = head.next ; } console .log (result); } } function createListNode (length ) { if (length <= 0 ) return null ; const node = new ListNode (length); node.next = createListNode (--length); return node; } const testNone = createListNode (10 );testNone.print (); function reverseNode (node ) { let result; (function reverseNodeAndGetTailNode (node ) { if (node.next === null ) return result = node; const next = node.next ; node.next = null ; reverseNodeAndGetTailNode (next).next = node; return node; })(node); return result; } const testNoneRevert1 = reverseNode (testNone);testNoneRevert1.print (); function reverseNode2 (head ) { let prev = null ; while (head) { const next = head.next ; head.next = prev; prev = head; head = next; } return prev; } const testNoneRevert2 = reverseNode (testNoneRevert1);testNoneRevert2.print ();
补充 总觉得自己的递归写法有点别扭,每次返回的是尾结点,还得用个变量保存最后的结果,也就是反转后的头结点。 搜了一下其他人的写法,然后自己再写还是差点绕晕了 - - 还是太菜了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function reverseNodeByRecursive (node ) { if (!node.next ) return node; const newNode = reverseNodeByRecursive (node.next ); node.next .next = node; node.next = null ; return newNode; } const testNoneRevert3 = createListNode (10 );testNoneRevert3.print (); const result = reverseNodeByRecursive (testNoneRevert3)result.print ();